C#擴展成員:你需要知道的一切

擴展方法在C#中已經存在很長時間。它們允許你向現有類型添加新方法,而無需修改其源代碼。這在處理你無法控制的框架或庫中的類型時非常有用。

然而,擴展方法有一個令人煩惱的地方:每個方法都必須在靜態類中定義,並且每個方法都必須使用this修飾符聲明第一個參數。當你為同一類型編寫多個擴展方法時,代碼開始變得重複。

擴展成員就是為了解決這個問題而引入的,它允許你將擴展方法分組到與特定類型相關的擴展塊中。

什麼是擴展成員?

擴展成員允許你定義這樣的擴展範圍:

extension System.String
{
    // 實例擴展
    int WordCount() => this.Split(' ').Length;

    // 靜態擴展
    static bool IsNullOrEmpty(string? value) => string.IsNullOrEmpty(value);
}

前後對比

之前(經典擴展方法)

public static class StringExtensions
{
    public static int WordCount(this string text)
    {
        return text.Split(' ').Length;
    }
}

之後(擴展塊)

extension System.String
{
    int WordCount() => this.Split(' ').Length;
}

示例

extension System.String
{
    bool IsLong() => this.Length > 20;
    static string? EmptyIfNull(string? value) => value ?? string.Empty;
}

使用方式

string message = "Hello World";
bool isLong = message.IsLong();
string result = string.EmptyIfNull(null);

擴展成員優先級規則

擴展成員的優先級總是低於類型的現有成員。這意味着:如果類型已經定義了同名方法,則使用類型的方法。

示例

extension System.String
{
    string ToUpper() => "Extension ToUpper called";
}

var text = "hello";
Console.WriteLine(text.ToUpper());

輸出: HELLO => 內置的string.ToUpper()獲勝

C# 14中的擴展成員 - 有什麼變化?

C# 13引入了擴展塊,允許你更自然地定義現有類型的方法和靜態助手。C# 14進一步擴展了這一功能,允許你定義更多種類的成員,而不僅僅是方法。

示例:擴展屬性(C# 14)

extension System.String
{
    int WordCount => this.Split(' ', StringSplitOptions.RemoveEmptyEntries).Length;
}

使用方式

string text = "Hello world from C#";
Console.WriteLine(text.WordCount); // 4

沒有括號。它的行為完全類似於只讀屬性。

示例:擴展索引器(C# 14)

extension System.String
{
    char this[Index index] => this[index];
}

使用方式

string s = "Hello";
Console.WriteLine(s[^1]); // o

這允許使用慣用的切片方式,而無需編寫自己的助手代碼。 更多精彩內容 請關注我的個人公眾號 公眾號(辦公AI智能小助手) 對安全感興趣的朋友可以關注我的安全公眾號(網絡安全技術點滴分享)