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

C# 3.0 擴充方法完整指南:宣告、匯入、呼叫優先序與實戰模式

     編輯:關於C語言

什麼是擴充方法?

擴充方法讓你不修改原始型別原始碼、不繼承,即可為現有型別「新增」實例方法語法的靜態方法。本質是語法糖,編譯期重寫為靜態方法呼叫。

宣告規則

  1. 定義在非泛型靜態類別中
  2. 方法本身為 static
  3. 第一個參數以 this 修飾,指定「被擴充的型別」
public static class StringExtensions
{
    public static int ToInt32(this string s) => Int32.Parse(s);
    
    public static T[] Slice<T>(this T[] source, int index, int count)
    {
        if (index < 0 || count < 0 || source.Length - index < count)
            throw new ArgumentException();
        var result = new T[count];
        Array.Copy(source, index, result, 0, count);
        return result;
    }
}

匯入與可見性

  • 透過 using 指令匯入擴充方法所在的命名空間
  • 命名空間層級控制可見範圍,避免全域汙染
using Acme.Utilities; // 匯入後 string 即可呼叫 .ToInt32()

呼叫優先序規則(核心機制)

  1. 實例方法優先:型別本身(含繼承鏈)的實例方法永遠勝過擴充方法
  2. 最近命名空間優先:若多個命名空間提供同名擴充方法,最後匯入(或更內層)的命名空間優先
  3. 靜態方法正常解析:若無實例方法匹配,按擴充方法規則重寫為靜態呼叫並進行多載解析

實戰範例:優先序演示

using N1;
namespace N1 {
    public static class E {
        public static void F(this object obj, int i) { }
        public static void F(this object obj, string s) { }
    }
}
class A { }
class B { public void F(int i) { } }
class C { public void F(object obj) { } }

static void Test(A a, B b, C c) {
    a.F(1);       // E.F(object, int) - A 無實例方法
    a.F("Hello"); // E.F(object, string)
    b.F(1);       // B.F(int) - 實例方法優先
    b.F("Hello"); // E.F(object, string) - B 無 string 多載
    c.F(1);       // C.F(object) - 實例方法優先(int 隱含轉換 object)
    c.F("Hello"); // C.F(object)
}

設計原則與最佳實踐

  • 保守使用:微軟建議僅在「無法修改原型別」且「實例方法不可行」時使用
  • 避免破壞發現性:IntelliSense 會顯示,但非原始碼一部分,團隊需建立文檔慣例
  • 不支援屬性、事件、運算子:僅限方法
  • 命名空間隔離:將擴充方法置於專屬命名空間(如 .Extensions),讓呼叫端明確 using

經典應用場景

  • LINQ 標準查詢運算子(Enumerable.Where、Select 等)
  • 基礎型別輔助方法(string.IsNullOrWhiteSpace 擴充、DateTime 格式化捷徑)
  • 介面預設實作(C# 8.0 前的替代方案)

擴充方法是 C# 語法擴充性的關鍵基石,善用它能打造流暢的 DSL 風格 API,但請記住:清晰的架構優於花俏的語法糖。

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