最近公司需要梳理開發規范,我負責寫 擴展方法 這一部分。
所以特地寫篇博文來准備一下。
MSDN: https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/extension-methods
https://www.cnblogs.com/pengze0902/p/6110094.html
https://www.cnblogs.com/Matcha/archive/2016/03/31/5312288.html
特別基礎的,怎么實現怎么調用,就不說了,着重看一下有哪些特殊的地方。
我對擴展類命名的習慣是類命名為原類名加上 Ex 后綴,Ex 代表的是 Extension 擴展。
可以使用擴展方法來擴展類或接口,但不能重寫擴展方法。與接口或類方法具有相同名稱和簽名的擴展方法永遠不會被調用(即擴展方法不會覆蓋類中原有的方法,這也是一個風險)。
編譯時,擴展方法的優先級總是比類型本身中定義的實例方法低。
使用場景:
1.一般大家都會寫一個 Util/Common/xxxHelper 之類的的工具類,里面會有 例如 StringHelper、DateTimeHelper 等等,每個Helper里面有多個static的通用方法,然后調用的時候就是StringHelper.GetNotNullStr("aa"); 這樣。還有一種普通的用法就是new 一個對象,通過對象去調用類里面的非static方法。這通常來說意味着一串的代碼,這個時候如果我們適當的使用擴展方法來寫這些方法,調用就會簡短很多,例如 "aa".GetNotNullStr(); 。
2.一般來說我們在開發的過程中,總會需要調用第三方類庫,或是使用一些我們沒有權限修改的類,這時候使用擴展方法就是一個不錯的選擇,但若第三方類庫或原有類添加了同名方法,那么擴展方法就會被覆蓋。
3.可以使用擴展方法來實現 鏈式調用。例如 LINQ。
優點:
1.使代碼變得更加簡潔,調用簡單。
2.不會破壞原有類的封裝性,只有引入了擴展方法命名空間的才可以使用。
缺點:
1.存在被覆蓋的可能。
關於擴展方法的一些建議:
1.注意對擴展目標的把控,對 List<T> 所做的擴展 是否可以改為對 IList<T> 或 IEnumerable<T>.
2.注意擴展方法的數量和分類,數量較多時可考慮分類。例如 轉換類型的擴展類,判斷邊界的擴展類。