擴展方法使你能夠向現有類型“添加”方法(oc的類目與此相似),而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。
擴展方法被定義爲靜態方法,但它們是通過實例方法語法進行調用的。 它們的第一個參數指定該方法作用於哪個類型,並且該參數以 this 修飾符爲前綴。
下面的示例演示爲 String 類定義的一個擴展方法。 請注意,它是在非嵌套的、非泛型靜態類內部定義的:
public static class ExtensionMethods
{
//查找字符串中某個字符點個數
public static int FindCharCount (this string str, char ch)
{
int count = 0;
foreach (char c in str) {
if (c == ch) {
count ++;
}
}
return count;
}
}
上述爲string 類添加了一個擴展方法,主要用於查詢某個字符串中有多少個指定字符;
可以這樣使用:
string str = "abcaaa";
int count = str.FindCharCount('a');
輸出count 爲4;
擴展方法是在編譯時被綁定的:
可以使用擴展方法來擴展類或接口,但不能重寫擴展方法。 與接口或類方法具有相同名稱和簽名的擴展方法永遠不會被調用。 編譯時,擴展方法的優先級總是比類型本身中定義的實例方法低。 換句話說,如果某個類型具有一個名爲 Process(int i) 的方法,而你有一個具有相同簽名的擴展方法,則編譯器總是綁定到該實例方法。 當編譯器遇到方法調用時,它首先在該類型的實例方法中尋找匹配的方法。 如果未找到任何匹配方法,編譯器將搜索爲該類型定義的任何擴展方法,並且綁定到它找到的第一個擴展方法。