標籤:des style blog http color os
今天繼續分享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 }
View Code
調用方法:
1 KuozFF method=new KuozFF ();2 3 method.NormalMethod();4 5 method.ExtensionMethod();6 7 Console.ReadLine();
View Code
輸出效果如下:
但是比如說別人給你的是一個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 : KuozFF20 21 {22 23 public void ExtensionMethod()24 25 {26 27 Console.WriteLine("我是擴充方法");28 29 }30 31 }
View Code
調用代碼如下:
1 MYKZFF method=new MYKZFF();2 3 method.NormalMethod();4 5 method.ExtensionMethod();6 7 Console.ReadLine();
View Code
效果如下:
以上結果可以看出效果是一樣的,但是有的人他不想寫繼承類,也不想修改原始碼怎麼辦?這時候就擴充方法誕生了!我先看看官方解釋吧:
擴充方法:使你能夠向現有類型“添加”方法,而無需建立新的衍生類別型、重新編譯或以其他方式修改原始類型。 擴充方法是一種特殊的靜態方法,但可以像擴充類型上的執行個體方法一樣進行調用。 對於用 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 ExtensionClass20 21 {22 23 public static void ExtensionMethod(this KuozFF k)24 25 {26 27 Console.WriteLine("我是擴充方法");28 29 }30 31 }
View Code
調用代碼如下:
1 KuozFF method=new KuozFF();2 3 method.NormalMethod();4 5 method.ExtensionMethod();6 7 Console.ReadLine();
View Code
輸出結果:
從上面代碼可以看出我們用戶端調用時無需關心擴充方法在哪兒寫的,你只要執行個體化原始類,擴充方法自動會有的。
擴充方法在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 }
View Code
以上就是微軟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 }
View Code
調用代碼如下:
1 string temp = "12";2 3 bool result = temp.IsNullOrEmpty();4 5 Console.WriteLine(result);6 7 Console.ReadLine();
View Code
輸出結果:
從調用代碼可以看出string本身是沒有IsNullOrEmpty()方法的,通過我們自己寫擴充方法有了該方法。
大家可以在自己的方法或者對系統類別的擴充可以寫一下,以便在日後的編碼過程中給自己提供方便。
今天就寫到這裡吧!謝謝朋友們的支援!