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

C# 3.0 新特性:擴充方法完整指南與最佳實踐

     編輯:關於C#

擴充方法允許在不修改原型別原始碼、不繼承的情況下,為現有型別「新增」實例方法語法。本質是靜態方法的語法糖,編譯期轉換為靜態呼叫。廣泛用於 LINQ (Enumerable)、框架擴充、DSL 建構。

定義語法與規則


public static class StringExtensions
{
    // this 修飾第一個參數 → 擴充方法
    public static bool IsNullOrEmpty(this string str) => string.IsNullOrEmpty(str);
    public static string TrimTo(this string str, int maxLen) => str?.Length > maxLen ? str.Substring(0, maxLen) : str;
}
  • 類別必須 static、非巢狀、非泛型 (但方法可為泛型)。
  • 方法必須 static。
  • 第一個參數加 this,型別即為擴充目標。
  • 命名空間需 using 才生效。

調用與解析優先順序


string s = "hello";
bool b = s.IsNullOrEmpty();        // 實例語法
bool b2 = StringExtensions.IsNullOrEmpty(s); // 靜態語法,等價
  • 實例方法優先:型別本身定義的實例方法 > 擴充方法。
  • 就近原則:同名擴充方法,當前命名空間 > 外層命名空間 > 引用命名空間。
  • 介面擴充:可為介面定義擴充方法,所有實作類自動擁有 (如 IEnumerable.Where)。

進階應用

  • 泛型擴充:public static TResult Map(this TSource src, Func selector)
  • 鏈式呼叫 (Fluent API):回傳 this 或建構器物件,建構 DSL。
  • 擴充列舉/介面/委派/陣列/委派:任何型別皆可擴充。

汙染與濫用風險

  • 命名空間汙染:using MyExtensions; 會將擴充方法注入所有型別 IntelliSense,造成雜訊。建議將擴充方法放在獨立命名空間,按需引用。
  • 基底型別擴充:擴充 object、string、IEnumerable 等高層型別影響極大,嚴謹評估必要性。
  • 狀態副作用:擴充方法應為純函數,避免修改傳入物件狀態 (除非明確命名如 AddRange)。
  • 效能:實質為靜態呼叫,無虛擬派發開銷,但泛型擴充可能導致程式碼膨脹。

Visual Studio 整合

  • IntelliSense 圖示標示藍色下箭頭 (↓) 區分擴充方法。
  • 「前往定義」 (F12) 直接導向靜態類別方法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved