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智能小助手) 對安全感興趣的朋友可以關注我的安全公眾號(網絡安全技術點滴分享)