C# 在 3.0 版本中提供了對 擴充套件方法
的支援,擴充套件方法常用於給一個已存在的類新增新的方法從而擴充套件該類的功能,最關鍵的是:你不需要在現存類中派生一個子類,你也不需要破壞性的修改類的現有程式碼骨架,更談不上重新編譯了,擴充套件方法能夠提供程式碼的可讀性同時又可以擴充套件類的功能。
.NET 框架中最常見的擴充套件方法包括 Linq 標準的查詢操作,這類擴充套件方法極大的擴充套件了System.Collections.IEnumerable 和 System.Collections.Generic.IEnumerable<T>
的查詢能力,如下圖:
現在你明白了擴充套件方法,你可以用這項技術去給已存在的 class 或者 interface 新增更多實用方法而不應該從子類中新增額外的方法,MSDN上說:擴充套件方法允許你給現有的類 新增
方法,而不需要你生成子類,重新編譯,或者任何其他形式的修改原有類,擴充套件方法是一種特殊的靜態方法,當你呼叫它的時候就好像它就是你擴充套件類的原生方法。
本質上來說,擴充套件方法也算是一種特殊的靜態方法,它允許你給已存在的類新增新的方法即使你沒有許可權訪問這個擴充套件類的原始碼,擴充套件方法除了簽名中的第一個引數是 this
之外就和靜態方法是一模一樣,你可以給任何一個類新增任意多的擴充套件方法,更的是:這個擴充套件方法特性還可以作用到值型別之上。
當你使用擴充套件方法的時候,請記住下面的幾個點:
擴充套件方法必須是一個靜態方法
擴充套件方法必須在 static class 內,類的名字無所謂
擴充套件方法的第一個引數一定是 this,後面跟上你需要擴充套件的型別
有一點要特別注意,如果擴充套件方法的名字和你要擴充套件類中的某一個方法重名了,那麼你的擴充套件方法將會失效,永遠也不會被呼叫。
使用 C# 擴充套件方法這一節中我們一起探討下如何使用 C# 來實現一個擴充套件方法,下面的程式碼清單展示了 C# 中的擴充套件方法到底長成什麼樣?
public static class StringExtensions { public static bool IsNumeric(this string str) { double output; return double.TryParse(str, out output); } }
請注意擴充套件方法中的第一個引數,正如之前討論過的,任何擴充套件方法都必須是靜態的,而且在引數之前還要申明一下 this 關鍵詞,比如像上面這個例子一樣,相當於告訴了編譯器你已經在 string 類上擴充套件了一個 IsNumeric 方法。
接下來一起看一下如何在 string 類中使用 IsNumeric 方法。
static void Main(string[] args) { string str = "100"; if (str.IsNumeric()) Console.WriteLine("The string object named str contains numeric value."); Console.Read(); }
當你執行完上面這段程式,會在控制檯輸出:The string object named str contains numeric value
。
你可以使用擴充套件方法這門技術透過向類新增方法的形式增強類的功能,而不需要修改,派生或者重新編譯原來的型別,正如之前我提到的,擴充套件方法也可以應用於值型別之上,接下來我透過一個例子來驗證下這是如何實現的。
下面我定義了一個 IntegerExtensions 類,裡面有一個 IsEven 擴充套件方法,當輸入的引數是偶數的話,這個方法會返回 true,否則返回 false。
public static class IntegerExtensions { public static bool IsEven(this int i) { return ((i % 2) == 0); } }
接下來的程式碼將會展示如何在 integer 型別上呼叫這個擴充套件方法。