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

C# 3.0 特性探秘 (六):擴充方法原理、設計準則與編譯器實現

     編輯:關於C語言

動機

無法修改第三方/BCL 型別源碼時,傳統做法建立靜態 Helper 類,呼叫不直觀 (Helper.Do(obj))。

擴充方法語法


public static class PropertyExtension
{
    public static object GetValueByName(this object self, string propertyName)
    {
        if (self == null) return null;
        var prop = self.GetType().GetProperty(propertyName);
        return prop?.GetValue(self, null);
    }
}
  • 類別、方法皆為 static。
  • 第一個參數加 this 修飾,型別為欲擴充的型別 (此處 object)。

使用效果


string s = "abc";
object len = s.GetValueByName("Length"); // 如同實例方法
// 等價於
object len = PropertyExtension.GetValueByName(s, "Length");

IL 驗證


L_0008: ldstr "Length"
L_000d: call object PropertyExtension::GetValueByName(object, string)

編譯器將實例呼叫語法重寫為靜態方法呼叫,無運行時開銷。

Visual Studio 智慧感知

擴充方法圖示

方法圖示帶藍色向下箭頭,標識為擴充方法。

設計準則

  1. 就近優先:同命名空間擴充方法優於外部命名空間。
  2. 避免污染:慎用於高層基類 (如 object),否則所有型別皆出現該方法。
  3. 語意清晰:僅擴充符合「是一種」關係的行為,勿濫用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved