C#4.0語法糖之第四篇: 擴展方法
今天繼續分享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()方法的,通過我們自己寫擴展方法有了該方法。