擴展方法被定義爲靜態方法,但它們是通過實例方法語法進行調用的。它們的第一個參數指定該方法作用於哪個類型,並且該參數以 this 修飾符爲前綴。僅當您使用 using 指令將命名空間顯式導入到源代碼中之後,擴展方法才位於範圍中。
下面的示例演示爲 System.String 類定義的一個擴展方法。請注意,它是在非嵌套、非泛型靜態類內部定義的:
namespace ExtensionMethods
{
public static class MyExtensions
{
public static int WordCount(this String
str)
{
return str.Split(new char[] { '
', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
可使用以下 using 指令將 WordCount 擴展方法放入範圍中:
using ExtensionMethods;
而且,可以在應用程序中使用以下語法對該擴展方法進行調用:
string s = "Hello Extension Methods";
int i = s.WordCount();
在代碼中,可以使用實例方法語法調用該擴展方法。但是,編譯器生成的中間語言 (IL) 會將代碼轉換爲對靜態方法的調用。因此,並未真正違反封裝原則。實際上,擴展方法無法訪問它們所擴展的類型中的私有變量。
定義和調用擴展方法:
1、定義一個靜態類以包含擴展方法。該類必須對客戶端代碼可見。有關可訪問性規則的更多信息,請參見訪問修飾符(C# 編程指南)。
2、將該擴展方法實現爲靜態方法,並使其至少具有與包含類相同的可見性。
3、該方法的第一個參數指定方法所操作的類型;該參數必須以 this 修飾符開頭。
4、在調用代碼中,添加一條 using 指令以指定包含擴展方法類的命名空間。
5、按照與調用類型上的實例方法一樣的方式調用擴展方法。
請注意,第一個參數不是由調用代碼指定的,因爲它表示正應用運算符的類型,並且編譯器已經知道對象的類型。您只需通過 n 爲這兩個形參提供實參。