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

C# 3.0 擴充方法核心機制與進階特性

     編輯:關於C#

擴充方法基本定義

三要素:靜態類別 + 靜態方法 + 第一個參數加 this 修飾詞。

public static class StringExtensions
{
    public static void Print(this string s) => Console.WriteLine(s);
    public static int WordCount(this string s) => s.Split(' ').Length;
}

// 使用 (需 using 命名空間)
"Hello World".Print();        // 輸出: Hello World
int count = "Hello World".WordCount(); // 2

進階特性深度解析

1. 名稱衝突:實例方法優先

public class MyClass
{
    public void Print() => Console.WriteLine("Instance");
}

public static class Ext
{
    public static void Print(this MyClass c) => Console.WriteLine("Extension");
}

var obj = new MyClass();
obj.Print(); // 輸出: Instance (實例方法優先)

IL 原理:編譯器先搜尋型別實例方法,找不到再搜尋 using 的命名空間中的擴充方法。衝突不報錯,靜態繫結至實例方法。

2. 擴充方法鏈式呼叫

public static class IntExtensions
{
    public static int Triple(this int x) => x * 3;
    public static int AddFive(this int x) => x + 5;
}

int result = 7.Triple().AddFive(); // (7*3)+5 = 26
// 編譯器轉換為: IntExtensions.AddFive(IntExtensions.Triple(7))

回傳值型別決定下一個可用的擴充方法,支援流暢介面設計。

3. 擴充介面 (詳見前文)

為介面新增方法,不破壞現有實作。

限制與注意事項

  • 不可擴充屬性/事件/運算子,僅限方法。
  • 不可存取私有成員,僅能透過公開介面操作擴充目標。
  • 泛型擴充:public static void Do<T>(this IEnumerable<T> source) 支援泛型型別參數。
  • 命名空間汙染:過度使用會導致 IntelliSense 雜亂,建議集中放在專屬命名空間 (如 MyLib.Extensions)。
  • 結構體傳值:this StructType s 為傳值,方法內修改不影響原始值;需用 ref this StructType s (C# 7.2+ ref extension) 才能修改原值。

最佳實踐

  1. 僅為無法修改原始碼的型別 (第三方、Bcl) 提供擴充。
  2. 方法語意應屬於該型別核心職責,否則應建立獨立輔助類別 (如 StringHelper.Truncate)。
  3. 避免與常見方法名稱衝突 (如 ToString, Equals)。
  4. 搭配 this 參數的 null 檢查,拋出 ArgumentNullException 符合慣例。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved