標籤:
1,把實值型別賦值到參考型別成為裝箱。object obj= 10; 2, 把參考型別賦值給實值型別用到拆箱操作。int a = (int)obj;3,is 操作符,用於檢查對象是否是某類型,返回結果是個bool類型。 object obj=10; if(num is Int32){ int a = (int)obj; }//前面只是判斷是否是int類型,當操作的時候,應該再有個強制轉換4,重載:1,方法名相同; 2,參數的數量不同,或者參數數量相同,參數類型不同。5,a++,先賦值操作,再加1; ++a,先加1再賦值操作。6,as 如果可以轉換,就轉換過去,不能轉換,返回NUll。 as 後面只能跟參考型別,只是為參考型別服務的。7,範型:一個預留位置,用於表示可變的類型的參數。 如: void Swap<T>(T a,T b);8,為什麼要用範型? 1,當程式中,有多個方法功能相似,只是參數的資料類型不同的時候,比如一個int,一個string,我們需要寫多個方法處理每種資料類型。 2,如果用object處理的話有弊端:一是 實值型別的需要大量的拆箱、裝箱操作,影響效能;二是參考型別會有許多強制轉換,也影響效能。8,什麼是範型? 聲名的時候類型不定,代用的時候,類型才決定下來。8,範型自訂MyList泛型類 public class MyList<T> { private T[] list; public int Count; public MyList<T>(int i):base() { this.list=new T[i]; this.Count=i; } public MyList<T>(T[] temp):base() { this.list=temp; this.Count=temp.Length; } public void Clear() { this.list=null; this.Count=0; } }9,ref out 傳遞引用的關鍵字 相同點: 兩者都是按地址傳遞的,使用後都會改變原來變數的數值。 調用函數和被調用函數中都要用ref,out修飾參數。 不同點: ref是有進有出,out是只出不進, 1,ref修飾的參數在調用之前,變數一定要賦值; 在被調用函數內可以不用再賦值。 2,out修飾符,在調用函數之前,變數可以不進行初始化; out參數數值不能進入被調用函數,當out參數進入被調用函數後會變為空白,需要你初始化一次。 注意: 一個方法有ref或out,一個方法沒有ref或out,可以實現重載。 兩個方法一個是ref的參數,一個是out修飾的參數,則不能實現重載,因為在編譯的時候兩者相同,只是在運行時才加以區分。10,析構方法 結構器與構造器正好相反,用於清空操作,釋放對象的一些資源,例如流,控制代碼,檔案的引用等。11,var a =10 推導型變數,通過右邊的資料類型,推導到左邊的變數。12,抽象方法和虛方法的異同: 1)抽象方法一定不能有實現;虛方法一定有實現。 2)抽象方法被繼承後,必須要重寫;虛方法被繼承後,可以不被重寫。 3)抽象類別中可以有虛方法;類中如果有抽象方法,則該類必須聲明為抽象類別。13,抽象類別的一些特點: 1)抽象方法只作聲明不做實現,旨在衍生類別中實現,所以抽象方法不能用private修飾。 2)抽象類別不能執行個體化。 3)抽象類別可以沒有抽象屬性和抽象方法,但是一旦有抽象方法,該類必須聲明為抽象類別。 4)如果抽象類別的衍生類別不是抽象類別,那麼必須重寫抽象類別中的所有抽象方法和抽象屬性。14,介面和抽象類別的異同: 相同點: 1)兩者都不可以直接執行個體化。 2)兩者都可以包含抽象成員。 不同點: 1)抽象類別除了擁有抽象成員外,可以擁有非抽象的成員;介面所有的成員都必須是抽象的。 2)抽象類別的成員可以有私人的:介面中的成員預設都是共有的。 3)介面中不能含有建構函式、解構函式、靜態成員、常量。抽象類別除了不能執行個體化,其他的和普通類沒什麼區別。 4)C#只支援但繼承;通過介面可以實現多繼承。 5)介面裡面不能有靜態函數,但是抽象類別裡面可以有。2014-12-31,集合:建立和管理數組的另一種方式 與數組的不同:對象集合可以根據需要動態增長和收縮 注意: 非範型集合: 命名空間 :System.Collections {ArrayList,Hashtable,Queue,Stack} 範型集合: 命名空間: System.Collections.Generic 只要類繼承了IEnumerable介面, foreach() 就可以遍曆 IEnumerable 介面裡面只有一個 public virtual GetEnumerator() 方法 Stack 棧 1)Stack類實現了ICollection和IEumerable介面。 2)後進先出的一種資料結構 3)Stack接受null作為有效值並且允許重複的元素 public virtual void Push(object obj); 把一個對象推導棧中 public virtual object Peek ();獲得棧頂的元素。 Queue 隊列 1)Queue類實現了ICollection和IEumerable介面。 2)先進後出的類型。 3)加入範型,用於約束傳入參數的類型,使型別安全。 public virtual void Enqueue(object obj); Dictionary<string,int> dic= new Dictionary<string,int>(); 字典 索引器:就是對類裡面的數組對象變更和查看操作的。是可以通過傳入參數的類型的不同進行重載。 public class Lanou { int[] age= new int[5]; public int this[index] { get { if(index<age.length) { return age[index]; } } set { if(index<age.length) { age[index]=value; } } } } Public void Main() { Lanou[] lanou= new Lanou[3]; //這裡不能通過 new Lanou[]() 建構函式來進行初始化。 //建構函式初始化產生一個對象,這裡是產生了包含3個對象的一個數組。 //int[] arr= new int[3]{1,2,3}; 大括弧初始化數組裡 每個int成員。 lanou[0] =new Lanou(); lanou[1] =new Lanou(); lanou[2] =new Lanou(); lanou[1][1] = 10;//第一個1 是說第二個數組,第二個1 是說所引起的下標為1 //這裡的lanou數組和 數組內每個索引器是分開的. }4,List和ArrayList的異同:
- 1)ArrayList 是動態對數組操作的類型,弱類型的,它裡面是對object類型的操作,會有大量的裝箱和拆箱操作,影響效能。且類型不安全 ,缺少編譯時間候的類型檢查,比如往數組裡存取一個不同類型的對象,會引起錯誤。不推薦使用。
- 2)List<T> 是範型集合,強型別的,不存在裝箱拆箱操作。在聲明的時候類型就確定了,會限制存取的物件類型。推薦使用。
- 相同點:都可以動態處理對數組對象。動態數組的好處是不必預先設定較大的數組,減小了不必要的記憶體開銷。
2014-11-30 靜態類進階、抽象類別 靜態類的特點:1,靜態類不能被執行個體化。2,靜態類不能被繼承。靜態類是密封的。3,靜態類裡面只能有靜態成員。不能有執行個體成員。4,靜態類裡面可以有靜態建構函式。不能有執行個體建構函式。 靜態建構函式:1,靜態類可以有靜態建構函式,靜態建構函式不可以被繼承。2,靜態類可以有靜態建構函式,非晶態類也可以有靜態建構函式。3,靜態建構函式沒有存取修飾詞,沒有參數,只有static關鍵字修飾。4,靜態建構函式不能直接被調用,只能當建立類執行個體或者引用靜態成員變數之前,自動被自動執行,並且只被執行一次。 注意1,靜態類在記憶體中是一直有位置的;2,非靜態類在執行個體化後是在記憶體中是獨立的,它的變數是不會重複的,在使用後會及時銷毀。不會出現未知錯誤,建議多使用非靜態類。 3,當定義的類不需要執行個體化的時候,我們使用靜態類;如果需要執行個體化對象,需要繼承等特性時,應該使用非靜態類,並且將統一使用的方法和變數設為靜態,所有的執行個體對象都能訪問。2014-12-4委託定義: 1,委託是將方法作為一個參數傳遞給其他方法。 2,委託類似於函數指標,但是與函數指標不同的是:委託是物件導向的,型別安全的和保險的。 3,委託既能引用靜態方法,也能引用執行個體方法。 4,委託實際上是個類,可以將方法動態傳遞給參數,避免大量使用if-else ,使程式具有更好的擴充性;異常處理機制: try{}catch(Exception e){Console.WriteLine(e.ToString());}finally{} catch裡面可以再加個try{}catch{},但是finally只能有一個。finally肯定會被執行。 catch後面可以再多加幾個catch{},多個catch用於抓獲不同類型的異常資訊,區分各種異常,用於不同的後邊處理工 作。所有的異常類型繼承自Exception基類。重寫和覆蓋的不同點:1,不管重寫和覆蓋都不會影響父類的功能。2,當調用子類建立父類的時候,如C1 c3 = new C2(); 重寫會修改父類的功能;而覆蓋不會修改父類的功能,仍然會調用父類的原有功能。3,虛方法、實方法都可以被覆蓋(new),重寫是只能虛方法可以重寫,是方法不能重寫,抽象方法,介面不可以被覆蓋。4,抽象方法,介面,標記為virtual的方法可以被重寫(override),實方法不可以。5,重寫使用的頻率比較高,能實現多態;覆蓋使用的頻率比較低,用於對以前無法修改的類進行繼承的時候。
C#物件導向筆記