.NET: 談談C#中的擴展方法

擴展方法(Extension Methods)是C#3.0時引入的新特性,相信不少人都聽過而且也都用過,最多見的是在LINQ中的使用。

 不只如此,在開發中,咱們也能夠建立本身擴展方法,使用它來優化類的設計、簡化代碼。本文將簡單地介紹擴展方法的概念、定義、使用場景以及要注意的點。框架

1、概念

擴展方法是一種特殊類型的靜態方法。對於一個C#類型,如類(包括密封類)、值類型、接口等,擴展方法能夠在不改變該類型源碼的前提下,爲它的實例提供新的成員。所以,若要爲一個框架或第三方庫的某個類型增長輔助功能,經過擴展方法就能夠垂手可得地實現,這也是「擴展」的意義所在。

2、如何定義

建立擴展方法很簡單,有如下幾個步驟:
一、建立一個靜態類;
二、在其中建立一個靜態方法;
三、爲這個靜態方法添加至少一個參數,並在第一個參數前加上this關鍵字,這個關鍵字會告訴編譯器當前方法是一個擴展方法。而這個方法將成爲第一個參數所屬類型的新成員。
如下一個典型的擴展方法,用於爲枚舉值提供一個可獲取其DescriptionAttribute特性值的方法:

 注意:只有在引用擴展方法所在的靜態類的命名空間後,才能使用它;不然,直接調用會編譯失敗。上例中,使用該擴展方法要引用TLA.Infrastructure.Extensions命名空間。優化

3、什麼時候使用

從擴展方法的概念上,不難看出,它能夠用在如下幾種場合:
一、要爲某個類型擴展功能,但沒有其源碼,好比某個框架或第三方庫中的一個類;例如,想要獲取一個列表中全部的奇數項,就能夠爲IList<T>接口增長一個擴展方法,這裏的IList<T>接口自己是.NET框架中的接口。

 二、即便能夠訪問原有類型的源碼,也可使用擴展方法爲它添加輔助功能;this

 三、重用代碼,使代碼更簡潔;因爲擴展方法封裝了一段完整的邏輯,因此,使用擴展方法就避免了複製粘貼代碼的狀況。上例中擴展方法的內容也符合這種使用場景。spa

4、注意事項

如下是定義與使擴展方法時的一些注意事項和最佳實踐: 一、擴展方法本質上是爲原有類型提供輔助功能,所以,在建立時,要確保它具備實際意義,且遵循單一職責原則;也即,不能過分使用擴展方法而且它可以完成一個具體、完整的功能; 二、擴展方法自己具備通用性,所以,它裏面應避免特定的業務數據類型及其相關邏輯; 三、若是爲接口增長擴展方法,擴展方法的命名空間能夠與接口的一致;不然,應儘可能避免與原類型寫在同一命名空間下,這樣會「污染」原類型。建議的作法是爲擴展方法所在的類設定一個單獨的命名空間,如:<Company>.<Product>.Extentions。不過,這樣作也有缺點:在操做原有類型的實例時,若是不引用擴展方法所在的命名空間,那麼,它就不容易被發現,而解決這個問題的辦法是,儘可能將擴展方法文檔化,並告訴項目組的其餘開發人員; 四、爲接口增長擴展方法後,則全部實現此接口的類都會包含該擴展方法; 五、在擴展方法中,要對第一個參數進行非空檢查,若是爲空,應拋出ArgumentNullException(參數爲空)異常。
相關文章
相關標籤/搜索