擴充套件方法
擴充套件方法是語法糖,允許在物件例項上呼叫靜態方法,就好像它們是型別本身的成員一樣。
擴充套件方法需要顯式目標物件。你需要使用 this
關鍵字從擴充套件型別本身訪問該方法。
擴充套件方法必須宣告為靜態,並且必須存在於靜態類中。
哪個名稱空間
為擴充套件方法類選擇名稱空間是可見性和可發現性之間的權衡。
最常提到的選項是為擴充套件方法設定自定義名稱空間。但是,這將涉及通訊工作,以便你的程式碼使用者知道擴充套件方法存在,以及在哪裡找到它們。
另一種方法是選擇一個名稱空間,以便開發人員通過 Intellisense 發現你的擴充套件方法。因此,如果要擴充套件 Foo
類,將擴充套件方法放在與 Foo
相同的名稱空間中是合乎邏輯的。
重要的是要意識到沒有什麼可以阻止你使用別人的名稱空間 :因此,如果你想擴充套件 IEnumerable
,你可以在 System.Linq
名稱空間中新增你的擴充套件方法。
這並不總是一個好主意。例如,在一個特定的情況下,你可能想要擴充套件一個普通型別(例如 bool IsApproxEqualTo(this double value, double other)
),但是沒有那個’汙染’整個 System
。在這種情況下,最好選擇一個本地的,特定的名稱空間。
最後,還可以將擴充套件方法放在沒有名稱空間的位置 !
一個很好的參考問題: 如何管理擴充套件方法的名稱空間?
適用性
在建立擴充套件方法時應小心謹慎,以確保它們適用於所有可能的輸入,並且不僅與特定情況相關。例如,可以擴充套件系統類,例如 string
,它使你的新程式碼可用於任何字串。如果你的程式碼需要在特定於域的字串格式上執行特定於域的邏輯,則擴充套件方法將不合適,因為它的存在會使使用系統中其他字串的呼叫者感到困惑。
以下列表包含擴充套件方法的基本功能和屬性
- 它必須是靜態方法。
- 它必須位於靜態類中。
- 它使用
this
關鍵字作為 .NET 中型別的第一個引數,此方法將由客戶端的給定型別例項呼叫。 - 它還通過 VS intellisense 顯示。當我們在型別例項之後按下 dot
.
時,它會進入 VS intellisense。 - 擴充套件方法應該與使用的名稱空間相同,或者你需要通過 using 語句匯入類的名稱空間。
- 你可以為具有擴充套件方法的類指定任何名稱,但該類應該是靜態的。
- 如果要向型別新增新方法並且沒有它的原始碼,那麼解決方案是使用並實現該型別的擴充套件方法。
- 如果你建立的擴充套件方法與你要擴充套件的型別具有相同的簽名方法,則永遠不會呼叫擴充套件方法。