1. 概述
本章重點講述類型中的各種方法,包括實例構造器、類型構造器、操作符/類型轉換重載、擴展方法、分部方法。
2. 名詞解釋
① 構造器:是允許將類型的實例初始化為良好狀態的一種特殊方法。
3. 主要內容
3.1 實例構造器和類(引用類型)
① 創建一個引用類型的實例時,首先為實例的數據字段分配內存,然后初始化對象的附加字段(類型對象指針和同步塊索引),最后調用類型的實例構造器 來設置對象的初始狀態。
② 實例構造器永遠不能被繼承。
③ 如果類的修飾符為static(sealed或abstract),編譯器不會在類的定義中生成一個默認構造器。
3.2 實例構造器和結構(值類型)
① 值類型的實例構造器只有在顯示調用時才會執行。
3.3 類型構造器
① 默認沒有定義類型構造器,只能定義一個。
② 必須是static,默認是私有的。保證只能被CLR調用。
③ 不要在值類型中定義類型構造器。
④ 類型構造器中的代碼只能訪問類型的靜態字段。
⑤ 顯式類型構造器可能包含具有副作用的代碼,所以需要精確拿捏運行的時間。
3.4 操作符重載方法
① CLR規范要求操作符重載方法必須是 public 和 static 方法。
3.5 轉換操作符方法
① C#中,implicit關鍵字告訴編譯器為了生成代碼來調用方法,不需要在源碼中進行顯式轉換。
而explicit告訴編譯器只有在發現了顯式轉型時,才調用方法。
operator關鍵字告訴編譯器該方法是一個轉換操作符。
operator之后是對象要轉換成的類型,后面的括號中,是要從什么類型轉換。
*建議將System.Decimal作為一個典型來研究操作符重載和轉換操作符方法。
public static implicit operator Rational (Single num) {return new Rational(num); }public static explicit operator Int32 (Rational r) {return r.ToInt32(); }
Rational r2 = 2.5F; Int32 x = (Int32) r1;
3.6 擴展方法
C#的擴展方法,允許你定義一個靜態方法,并用實例方法的語法來調用它。(在第一個參數前加this關鍵字)
3.6.1 規則和原則
① C#只支持擴展方法,不支持擴展屬性、擴展事件、擴展操作符等。
② 擴展方法必須在非泛型的靜態類中聲明。
③ 要求靜態類本身具有文件作用域。
④要求引用所屬的命名空間。
3.6.2 用擴展方法擴展各種類型
可以為委托或者枚舉類型添加擴展方法。
3.6.3 ExtensionAttribute類
C#中,一旦用this關鍵字標記了某個靜態方法的第一個參數,編譯器就會在內部向該方法應用一個定制attribute。
3.7 分部方法
① 只能在分部類或結構中聲明。
② 只能返回void,不能有輸出參數。
③ 聲明和實現必須具有完全一致的簽名。
④ 如果沒有對應的實現部分,便不能在代碼中創建一個委托來引用這個分部方法。
⑤ 總是被視為private方法。
4. 總結
?