三要素:靜態類別 + 靜態方法 + 第一個參數加 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
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 的命名空間中的擴充方法。衝突不報錯,靜態繫結至實例方法。
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))
回傳值型別決定下一個可用的擴充方法,支援流暢介面設計。
為介面新增方法,不破壞現有實作。
public static void Do<T>(this IEnumerable<T> source) 支援泛型型別參數。MyLib.Extensions)。this StructType s 為傳值,方法內修改不影響原始值;需用 ref this StructType s (C# 7.2+ ref extension) 才能修改原值。StringHelper.Truncate)。ToString, Equals)。this 參數的 null 檢查,拋出 ArgumentNullException 符合慣例。