伊莉討論區

標題: C# 小技巧 - 擴充方法 [打印本頁]

作者: zxc7827691    時間: 2019-6-29 04:58 PM     標題: C# 小技巧 - 擴充方法

本帖最後由 zxc7827691 於 2019-6-29 05:10 PM 編輯

擴充方法可讓您在現有類型中「加入」方法,而不需要建立新的衍生類型、重新編譯,或是修改原始類型。 擴充方法是一種特殊的靜態方法,但是會將它們當成擴充類型上的執行個體方法來呼叫。

其實最常見的案例就是 Linq 的方法操作 IEnumerable 型態的資料
  1. int[] numbers = new int[] { 1, 2, 3, 4, 5 };
  2. int sum = numbers.Sum(); // 15
複製代碼


我們發現使用 .Sum() 這個方法是 Linq 套件提供的,Linq 是怎麼擴充出這個方法呢?
查看 Linq 的原始碼發現
  1. public static int Sum(this IEnumerable<int> source);
複製代碼


這種寫法就是所謂的「擴充方法」,撰寫一個靜態類型 MyExt,提供一個靜態方法 MyExtMethod,其中第一個參數就是我們要擴充的類型 this IEnumerable<int>,必須要加上 this ,後面可以添加額外的參數
  1. public static class MyExt
  2.     {
  3.         public static int MyExtMethod(this IEnumerable<int> source)
  4.         {
  5.             return 0;
  6.         }
  7.     }
複製代碼


接著,就可以跟 Linq 一樣,使用自己擴充的功能了
  1. int[] numbers = new int[] { 1, 2, 3, 4, 5 };
  2. int ext = numbers.MyExtMethod(); // 0
複製代碼


其實這個技巧除了可以擴充既有的類別,十分方便。在做產品或大型專案時,依我的經驗最經典的案例就是「標準功能」與「客製化功能」, A 組件的 class 提供標準功能的方法,B 組件則擴充 A 組件的 class,提供客製化方法。我們就能將客製化部分獨立出來,也不會把某些客製功能,破壞到既有的程式架構或邏輯。

更多資料可以參考官網:https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

以上分享








歡迎光臨 伊莉討論區 (http://wwwaaa.eyny.com/) Powered by Discuz!