今天繼續分享C#4.0語法糖的擴展方法,這個方法也是我本人比較喜歡的方法。大家先想想比如我們以前寫的原始類型不能滿足現在的需求,而需要在該類型中添加新的方法來實現時大家會怎么做。我先說一下我沒有學習到這個知識點之前做的方法:
最笨的辦法就是修改原來的類型,然后添加一個方法來達到需求的變更,如下代碼所示:

1 public class KuozFF 2
3 { 4
5 public void NormalMethod() 6
7 { 8
9 Console.WriteLine("我是原始方法"); 10
11 } 12
13 public void ExtensionMethod() 14
15 { 16
17 Console.WriteLine("我是擴展方法"); 18
19 } 20
21 }
調用方法:

1 KuozFF method=new KuozFF (); 2
3 method.NormalMethod(); 4
5 method.ExtensionMethod(); 6
7 Console.ReadLine();
輸出效果如下:
但是比如說別人給你的是一個dll文件,你沒有辦法修改,但是你想在該類中添加你的方法怎么辦?
自己寫一個類,然后該類繼承自原始類,代碼如下:

1 public class KuozFF 2
3 { 4
5 public void NormalMethod() 6
7 { 8
9 Console.WriteLine("我是原始方法"); 10
11 } 12
13
14
15 } 16
17
18
19 public class MYKZFF : KuozFF 20
21 { 22
23 public void ExtensionMethod() 24
25 { 26
27 Console.WriteLine("我是擴展方法"); 28
29 } 30
31 }
調用代碼如下:

1 MYKZFF method=new MYKZFF(); 2
3 method.NormalMethod(); 4
5 method.ExtensionMethod(); 6
7 Console.ReadLine();
效果如下:
以上結果可以看出效果是一樣的,但是有的人他不想寫繼承類,也不想修改源代碼怎么辦?這時候就擴展方法誕生了!我先看看官方解釋吧:
擴展方法:使你能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 對於用 C# 編寫的客戶端代碼,調用擴展方法與調用在類型中實際定義的方法之間沒有明顯的差異
這是微軟MSN上的解釋,我們直接看代碼,擴展方法是長什么樣吧:

1 public class KuozFF 2
3 { 4
5 public void NormalMethod() 6
7 { 8
9 Console.WriteLine("我是原始方法"); 10
11 } 12
13
14
15 } 16
17
18
19 public static class ExtensionClass 20
21 { 22
23 public static void ExtensionMethod(this KuozFF k) 24
25 { 26
27 Console.WriteLine("我是擴展方法"); 28
29 } 30
31 }
調用代碼如下:

1 KuozFF method=new KuozFF(); 2
3 method.NormalMethod(); 4
5 method.ExtensionMethod(); 6
7 Console.ReadLine();
輸出結果:
從上面代碼可以看出我們客戶端調用時無需關心擴展方法在哪兒寫的,你只要實例化原始類,擴展方法自動會有的。
擴展方法在C#4.0中是無處不在的,下面我們看看C#內置的擴展方法來更深刻的了解一下:

1 public static class Enumerable 2
3 { 4
5 public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); 6
7 public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate); 8
9 public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector); 10
11 public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector); 12
13 }
以上就是微軟IEnumerable類的擴展方法,所以我們平時用的時候方法后面點.后就能出來怎么多豐富的where,select等方法是擴展方法起的作用。這里只是拿出一點擴展方法來展示了一下。
下面我們寫一下string類擴展方法,我們以前判斷一個字符串是否null或空時,用系統內置方法string. IsNullOrEmpty(s),我們把這個方法做成擴展方法演示一下:

1 public static class Demo1 2
3 { 4
5 public static bool IsNullOrEmpty(this string s) 6
7 { 8
9 return string.IsNullOrEmpty(s); 10
11 } 12
13 }
調用代碼如下:

1 string temp = "12"; 2
3 bool result = temp.IsNullOrEmpty(); 4
5 Console.WriteLine(result); 6
7 Console.ReadLine();
輸出結果:
從調用代碼可以看出string本身是沒有IsNullOrEmpty()方法的,通過我們自己寫擴展方法有了該方法。
大家可以在自己的方法或者對系統類的擴展可以寫一下,以便在日后的編碼過程中給自己提供方便。
擴展方法注意事項:
1、它至少有一個參數;
2、第一個參數必須附加 this 關鍵字;
3、第一個參數不能有任何其他修飾符(out/ref)
4、第一個參數不能是指針類型
5、 C# 只支持擴展方法,不支持擴展屬性、擴展事件等;
6、 擴展方法的命名空間可以使用 namespace System ,但不推薦;
7、 定義擴展方法的類是靜態類;
今天就寫到這里吧!謝謝朋友們的支持!
文章原文在本人個人網站中