今天繼續分享C#4.0語法糖的擴展方法,這個方法也是我本人比較喜歡的方法。你們先想一想好比咱們之前寫的原始類型不能知足如今的需求,而須要在該類型中添加新的方法來實現時你們會怎麼作。我先說一下我沒有學習到這個知識點以前作的方法:html
最笨的辦法就是修改原來的類型,而後添加一個方法來達到需求的變動,以下代碼所示:數組
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();
輸出效果以下:ide
可是好比說別人給你的是一個dll文件,你沒有辦法修改,可是你想在該類中添加你的方法怎麼辦?post
本身寫一個類,而後該類繼承自原始類,代碼以下:學習
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 }
調用代碼以下:this
1 MYKZFF method=new MYKZFF(); 2 3 method.NormalMethod(); 4 5 method.ExtensionMethod(); 6 7 Console.ReadLine();
效果以下:編碼
以上結果能夠看出效果是同樣的,可是有的人他不想寫繼承類,也不想修改源代碼怎麼辦?這時候就擴展方法誕生了!我先看看官方解釋吧:spa
擴展方法:使你可以向現有類型「添加」方法,而無需建立新的派生類型、從新編譯或以其餘方式修改原始類型。 擴展方法是一種特殊的靜態方法,但能夠像擴展類型上的實例方法同樣進行調用。 對於用 C# 編寫的客戶端代碼,調用擴展方法與調用在類型中實際定義的方法之間沒有明顯的差別3d
這是微軟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()方法的,經過咱們本身寫擴展方法有了該方法。
你們能夠在本身的方法或者對系統類的擴展能夠寫一下,以便在往後的編碼過程當中給本身提供方便。
擴展方法注意事項:
一、它至少有一個參數;
二、第一個參數必須附加 this 關鍵字;
三、第一個參數不能有任何其餘修飾符(out/ref)
四、第一個參數不能是指針類型
五、 C# 只支持擴展方法,不支持擴展屬性、擴展事件等;
六、 擴展方法的命名空間可使用 namespace System ,但不推薦;
七、 定義擴展方法的類是靜態類;
今天就寫到這裏吧!謝謝朋友們的支持!
有時須要將一個字符串分隔後,轉換成指定類型的數組或List<T>,好比服務器端收到提交的一組checkbox的值,多是一個ID串,相似:56,657,0,1,2,3,4,5,6,7,8,須要將它轉成一個int數組或List<T>再進行後續處理。
在將字符串轉換成List<T>中看到了關於這個的討論,整理以下。
咱們可用Array.ConvertAll 泛型方法來實現,代碼以下:
string str = "56,657,0,1,2,3,4,5,6,7,8"; int[] arrInt = Array.ConvertAll<string, int>(str.Split(','), s => int.Parse(s)); foreach (int i in arrInt) Console.WriteLine(i);
或者,咱們想用到一些「奇技淫巧」,好比將這功能作成string的擴展方法:
public static List<T> ToList<T>(this string str, char split, Converter<string, T> convertHandler) { if (string.IsNullOrEmpty(str)) { return new List<T>(); } else { string[] arr = str.Split(split); T[] Tarr = Array.ConvertAll(arr, convertHandler); return new List<T>(Tarr); } }
調用方法:
List<int> intList = str.ToList<int>(',', s => int.Parse(s));