C#進階特性
1 繼承
1)衍生類別將繼承基類除了建構函式和解構函式的所有成員。
2)與C++不同,C#只支援類的單一繼承。
3)C#提供了關鍵字base來訪問基類成員,調用基類建構函式。
4) 可以用new關鍵字來覆蓋基類的成員
2 多態
1)C#通過使用關鍵字virtual在基類中定義虛方法,用override在衍生類別中重載虛方法實現多態。
3 抽象(abstract)
1)抽象類別用abstract關鍵字聲明,只能作為基類, 不能執行個體化
2)抽象類別可以包含抽象成員或非抽象成員, 如果包含的是抽象成員,不能用{}實現,並且不能在衍生類別中用base來訪問。抽象方法只能在抽象類別中使用。
3)對抽象類別不能使用sealed關鍵字
4)從抽象類別派生的非抽象類別必須通過重載實現它所繼承來的所有抽象成員。
4 密封(sealed)
1)密封類即不能被繼承的類,密封類不可能同時又是抽象類別
2)密封方法的目的是使方法所在類的衍生類別無法重載該方法,所以,密封方法必須是對基類虛方法的重載。
5 操作符重載
1)C#中,所有的操作符都屬於類的靜態方法(public static)。所有參數都必須在參數列表中列出(其本身不能作為參數)
2)C++中,操作符不是類的靜態方法,並且其自身作為第一個參數。 或者,操作符不是類的成員, 而是作為friend方法, 此時需列出所有參數, 類似於C#。
6 類型轉換
1)隱式類型轉換:低精度到高精度轉換(或整數到浮點數轉換,精度下降值不變);十進位0到任何枚舉類型的轉換
2)顯式類型轉換:高精度到低精度;數實值型別到枚舉類型的轉換;用Convert類進行顯式轉換(轉換失敗時拋出異常)。
3)類型的引用轉換:衍生類別類型引用到基類類型引用的轉換。null或基類類型的引用到衍生類別的轉換(轉換失敗拋出異常)
4)裝箱與拆箱:裝箱:實值型別的值--拷貝-->object執行個體;拆箱:Object執行個體-- 拷貝-->實值型別的值
7 結構
1)結構使一種實值型別,類是一種參考型別
2)結構不支援繼承(但可以實現介面)
3)結構中不能聲明其預設建構函式。
4)由於是實值型別,結構可以用new,也可以不用new關鍵字來建立執行個體。
5)C#文檔指出:小於16位元組的類如果作為結構來處理可能更高效。
8 介面
1)介面組合一系列相關的操作,通過類或結構來實現。
2)介面成員預設的訪問方式是public
3)介面成員可以是方法,性質,索引指標或事件,但不能是欄位。
4)介面支援多繼承
5)如果一個類從多個介面繼承而來,而其介面中有重複的方法聲明, 此時可以用介面的顯式成員實現,顯式實現只能通過介面調用。
9 集合
1)集合是一組可以通過遍曆每個元素來訪問的一組對象,推薦利用.net提供的相關幾何類來派生自己的集合。
2)一個集合如果實現了IEnumerable, 同時也要實現IEnumerator.
3)Array與ArrayList的比較:
(1)Array可以定義為多維陣列,而ArrayList只能是一維的
(2)Array可以定義自己的下限,而ArrayList的下限始終為0
(3)Array的元素通常是特定類型,而ArrayList的元素都是Object類型,因此在操作ArrayList的元素時通常要進行裝箱拆箱操作,影響效能。
(4)Array的元素數目是固定的, 而ArrayList的元素數目是可以自動擴充的。
(5)Array只提供了單個元素的操作, 而ArrayList還提供了操作一個範圍內元素的方法。
10 索引器
1)索引器(Indexer)提供了對類的數組式訪問功能。
2)一般寫成這樣: public string this[int ind]{get{} set{}}
11異常處理
1)三種類型的異常:SystemException; IOException; ApplicationException,使用者自訂的異常需要從ApplicationException派生。
2)異常拋出和捕獲
try
{
}
catch([expression])
{
}
finally
{
}
即使try ,catch塊中存在break,continue,goto或return語句,finally中的代碼始終會被執行。
3)可以包含多個catch語句,但出現異常時只會執行第一個匹配的catch塊, 所以, 如果放在前面的異常類型是後面異常類型的基類或類型相同,就會發生錯誤。
4)catch語句處理異常時, 可以重新拋出異常,新異常中可以嵌入原異常,這樣就可以知道整個異常拋出的過程了。通過Exception的InnerException屬性可以擷取原來的異常。
12 委託
1)委託是一種參考型別,它用一組特定的參數和傳回型別來封裝方法, 類似與C中的函數指標,但跟具安全性。
2)組合委託(Multicase Delegate):組合委託只能組合相同類型的委託,且其傳回型別必須是void,可以用+, -, +=, -=來實現。
13 事件
1)訂閱事件的類(subscriber)也可以成為發布事件的類(publisher)的使用者,當publisher產生事件時(委託被執行),所有的使用者都將得到通知,並提供對這些事件的響應(和該委託相關聯的處理方法被自動執行)。
2)發布事件的類定義用委託聲明的事件,在使用者類中定義響應事件的方法,該方法與事件通過委託關聯。
3)聲明一個事件一般如下:
public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler OnEvent;
14 預先處理指令
1)與C++不同, C#沒有獨立的預先處理指令,其預先處理指令其實是由編譯器來執行的。
2)一行只能有一條預先處理指令。
3)#define/#undef; #if/#elif/#else/#endif; #warning/#error; #line;/ #region/#endregion
15 屬性(Attribute)
1)在類聲明,類成員聲明等之前,用於指定某些附加資訊。
2)把屬性應用於程式實體,他們所指定的附加資訊可以用在程式的文檔說明中做解釋型工作,可以在程式運行時用反射技術檢索這些資訊。
3)屬性是通過屬性類的聲明定義的,派生於System.Attributes.
4)Conditional,Obsolete屬性的使用。
16 組件與程式集
1)DLL Hell:當多個應用程式試圖共用一個公用群組件(如某個動態串連庫(DLL)或某個元件物件模型(COM)類)時所引發的一系列問題。最典型的情況是,某個應用程式將要安裝一個新版本的共用組件,而該組件與機器上的現有版本不向後相容。雖然剛安裝的應用程式運行正常,但原來依賴前一版本共用組件的應用程式也許已無法再工作。
2)程式集包括:資訊清單;類型中繼資料;MSIL代碼;資源
3)程式集特點:自說明(不用再去查詢註冊表或其他資訊);並行載入(同一程式的不同版本可以在系統中同時使用);零影響安裝(只需複製)