先說有用的,c#擴展方法結論:
擴展方法能夠向現有類型“添加”方法,而無需創建新的派生類型,重新編譯或以其他方式修改原始類型。擴展方法必須是靜態方法,可以像實例方法一樣進行調用。且調用同名中實際定義的方法優先級要高於擴展方法。
先來個簡單的例子:
public static class test { public static int CountYourNumber(this string str) { return str.Split(new char[] {' ','.','?' }, StringSplitOptions.RemoveEmptyEntries).Length; } } }
這里我定義了一個測試類,CountYourNumber方法作為string類型的擴展方法。當中第一個參數前面出現一個this,這表示對string中添加擴展方法,在調用該接口時,可以調用到該擴展方法。
public static void testMethod() { string s = "Hello Extension Methods,I`m learning you"; int alphabetNum = s.CountYourNumber(); }
這里alphabetNum接收到的是s的字母數量。s是定義的一個字符串,這里可以看出,我們自己寫的擴展方法可以在這里調用,會有一個(擴展)字樣,注意這里調用方法時不需要傳參數。截圖:
在我們實際應用中也很廣泛,舉個我們常用的例子:linq標准查詢,或者找到Queryable類,截圖如下:
這些都是微軟寫好的擴展方法,注意:這些方法里的第二個參數是需要在擴展方法里傳入的第一個參數。Expression<func<TSourse,int>> selector這種是需要傳入一個lambda表達式的。而第一個參數,就是需要擴展的類。
分割線------------------------------------------------------------------
擴展方法與其擴展的類之間並沒有什么本質的聯系,最終編譯器還是將擴展方法轉化成靜態類的靜態方法調用,所以擴展方法不能訪問相應類的私有字段和私有方法;至於為什么使用靜態類的靜態方法,有一種說法是這樣效率相對較高,同時擴展方法作為其他類的擴展,本身類的實例化沒有什么意義。