類的擴展方法

C#當中的擴展方法

 

  先說有用的,c#擴展方法結論:html

  擴展方法可以向現有類型「添加」方法,而無需建立新的派生類型,從新編譯或以其餘方式修改原始類型。擴展方法必須是靜態方法,能夠像實例方法同樣進行調用。且調用同名中實際定義的方法優先級要高於擴展方法。c#

  先來個簡單的例子:post

1
2
3
4
5
6
7
8
9
public static class test
     {
         public static int CountYourNumber( this string str)
         {
             return str.Split( new char [] { ' ' , '.' , '?' },
                 StringSplitOptions.RemoveEmptyEntries).Length;
         }
     }
}

  這裏我定義了一個測試類,CountYourNumber方法做爲string類型的擴展方法。當中第一個參數前面出現一個this,這表示對string中添加擴展方法,在調用該接口時,能夠調用到該擴展方法。測試

1
2
3
4
5
public static void testMethod()
{
     string s = "Hello Extension Methods,I`m learning you" ;
     int alphabetNum = s.CountYourNumber();
}

  這裏alphabetNum接收到的是s的字母數量。s是定義的一個字符串,這裏能夠看出,咱們本身寫的擴展方法能夠在這裏調用,會有一個(擴展)字樣,注意這裏調用方法時不須要傳參數。截圖:this

  在咱們實際應用中也很普遍,舉個咱們經常使用的例子:linq標準查詢,或者找到Queryable類,截圖以下:url

  這些都是微軟寫好的擴展方法,注意:這些方法裏的第二個參數是須要在擴展方法裏傳入的第一個參數。Expression<func<TSourse,int>> selector這種是須要傳入一個lambda表達式的。而第一個參數,就是須要擴展的類。spa

分割線------------------------------------------------------------------code

  擴展方法與其擴展的類之間並無什麼本質的聯繫,最終編譯器仍是將擴展方法轉化成靜態類的靜態方法調用,因此擴展方法不能訪問相應類的私有字段和私有方法;至於爲何使用靜態類的靜態方法,有一種說法是這樣效率相對較高,同時擴展方法做爲其餘類的擴展,自己類的實例化沒有什麼意義。htm

相關文章
相關標籤/搜索