首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

CLR 筆記:方法、建構函式、運算子重載與參數傳遞全解析

     編輯:關於.NET

1. 實例建構函式 - 引用類型

  1. 配置實例資料欄位記憶體。
  2. 初始化系統開銷欄位(型別物件指標、同步區塊索引)。
  3. 呼叫型別實例建構函式設定初始狀態。

建構函式不可繼承、不可用 virtual/new/override/sealed/abstract。無顯式建構函式時編譯器產生預設無參建構函式(僅呼叫基底類別無參建構函式)。抽象類別預設建構函式為 protected,否則為 public;static 類別不產生預設建構函式。基底類別無無參建構函式時,衍生類別必須顯式 : base(...) 呼叫。最終皆呼叫 System.Object 公用無參建構函式。反序列化與 MemberwiseClone 不需實例建構函式。內聯欄位初始化實際發生在預設建構函式中。

2. 實例建構函式 - 值類型

  • C# 結構不可包含顯式無參建構函式(CLR 允許)。
  • 結構必須顯式呼叫有參建構函式,new 時才執行建構函式語句。
  • CLR 保證所有實例欄位初始化為 0/null(未手動設定時自動配置)。
  • 結構中不可使用內聯直接給欄位賦值(初始化只能在顯式建構函式中)。
  • 每個欄位必須在建構函式中初始化,否則編譯錯誤。

3. 靜態建構函式

  • 適用於介面/引用類型/值類型(C# 不支援介面)。
  • 位於 AppDomain,類別首次被存取時執行。
  • 每個類別最多一個,永無參數,私有(不可顯式宣告)。
  • 值類型定義 cctor 無意義——無機會執行。
  • 調用過程:編譯期 JIT 檢查 AppDomain 是否已執行;執行期多線程需互斥鎖確保僅執行一次。
  • 避免兩個類別 cctor 互相引用(順序不確定)。cctor 拋出異常 → 型別不可用,後續操作拋 TypeInitializationException。
  • cctor 僅存取靜態欄位,用途即初始化靜態欄位;內聯初始化效果相同。不應呼叫基底類別 cctor(無關係)。CLR 不支援靜態 Finalize。

效能:Precise(cctor 初始化)vs BeforeFieldInit(內聯初始化)。差異在於 IL 是否附加 BeforeFieldInit 標記。文中附基準測試程式碼(Stopwatch)。

4. 運算子重載

CLR 不認識運算子;運算子為 C# 定義,對應編譯器識別方法。運算子重載為 public static,分一元/二元。要求至少一個參數與重載方法類型相同。參數不可用 ref/out。例:+ 對應 op_Addition(屬於 specialname 群組)。建議同時定義友好方法(如 Add)。

5. 轉換運算子方法

System.Decimal 為絕佳學習範例。implicit/explicit 運算子為 public static,封裝建構函式與 ToXXX 方法。IL 中同名方法僅回傳類型不同(僅 IL 允許)。

6. 透過引用傳遞參數

  • 預設按值傳遞(複製副本,修改不影響外部)。
  • ref:呼叫前必須初始化;方法內可修改。
  • out:呼叫前可未初始化;方法內必須賦值。
  • CLR 中 ref/out 等效;C# 有區別。方法可基於 ref/out 多載,但不可僅因 ref/out 差異多載。
  • 泛型 Swap<T>(ref T, ref T) 為標準交換寫法。
  • 值/引用類型行為相同,差別在配置記憶體 vs 指標。
  • 應用模式:ProcessFiles(ref FileStream fs) 實現流水線處理。

7. params 可變參數

僅最後一個參數可為 params,必須為一維陣列。可傳 null、零長度陣列、甚至省略(預設零長度陣列)。呼叫時無需建立陣列物件。

8. 參數與回傳類型設計原則

  1. 參數盡可能指定最弱類型(如 IEnumerable<T> 而非 IList<T>)。
  2. 回傳類型盡可能指定最強類型(如 FileStream 而非 Stream)。
  3. 若望不影響呼叫端修改內部實作,回傳類型用最弱類型中的最強者(如 IList<T> 而非 List<T>)。

9. CLR 不支援常數方法與常數參數

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved