this 是 C# 中最常用也最易混淆的關鍵字之一。本文系統梳理其四種核心用法——索引器、實例參數傳遞、構造函數鏈調用、擴展方法修飾符,配合完整類結構代碼、控制台測試輸出與 IL 級原理解析,幫助你徹底掌握 this 的編譯時與運行時語義。
_data.TryGetValue(key, out var v) ? v : null; set => _data[key] = value; } } // 使用 var u = new User(); u["Name"] = "Alice"; u["Age"] = 25; Console.WriteLine(u["Name"]); // Alice
get_Item/set_Item 方法(可通過 IndexerNameAttribute 重命名)。this[int row, int col] 實現矩陣訪問。this 代表調用該方法的對象引用。static 方法、字段初始化器、屬性初始化器中使用。this 為值類型引用(ref this),可修改字段。this(...) 復用初始化邏輯this(...) 必須出現在構造函數初始化器列表中,且只能調用同類其他構造函數。base(...) 調用基類構造函數。this T 賦予現有類型新方法x.Name = "Bob Jr.");
IEnumerable<T> 的 LINQ 算子)。輸出:
| 用法 | IL 特徵 |
|---|---|
| 實例方法隱式參數 | ldarg.0 加載 this 到棧頂,實例方法簽名實際為 (this, args...) |
| 索引器 | 編譯為 get_Item/set_Item,屬性標記 DefaultMember |
| 構造函數鏈 | 生成 call instance void .ctor(...) 指令調用目標構造函數 |
| 擴展方法 | 靜態方法,元數據標記 ExtensionAttribute,調用點編譯為 call UserExtensions.Sing(user) |
| 誤區 | 正確做法 |
|---|---|
| 在 static 方法中用 this | static 方法無 this,改用類名訪問靜態成員 |
| 構造函數體中用 this() | this() 只能在初始化器列表,不能在函數體內 |
| 擴展方法嘗試訪問私有成員 | 擴展方法只是語法糖,無特權,只能訪問 public/internal |
| 結構體方法中修改 this 字段 | 結構體實例方法隱式接收 ref this,直接賦值字段即可修改 |
| 索引器只能有一個參數 | 支援多參數,如 this[int x, int y] |
this 四大用法分別對應「對象自描述」「對象交互」「構造復用」「類型擴展」四大編程場景。索引器讓領域模型更直觀;參數傳遞實現協作;構造函數鏈消除重複初始化;擴展方法實現開閉原則下的類型增強。掌握其編譯原理與限制,能寫出更符合 C# 慣用語的代碼。