擴充方法

注意

此內容是由 Pearson Education, Inc. 授權轉載自架構設計指導方針:可重複使用 .NET 程式庫的慣例、慣用語和模式,第 2 版。 該版於 2008 年出版,該書自那以後已於第三版進行了全面修訂。 此頁面上的某些資訊可能已過期。

擴充方法是語言功能,允許使用執行個體方法呼叫語法來呼叫靜態方法。 這些方法必須採用至少一個參數,代表方法要在其上操作的執行個體。

定義這類擴充方法的類別稱為 "sponsor" 類別,而且必須宣告為靜態。 若要使用擴充方法,您必須匯入定義 sponsor 類別的命名空間。

❌ 避免不小心定義擴充方法,特別是針對您未擁有的型別。

如果您擁有型別的原始程式碼,請考慮改為使用執行個體方法。 如果您未擁有且想要新增方法,請謹慎進行。 自由使用擴充方法可能會造成未設計用來具有這些方法的型別 API 雜亂。

✔️ 請考慮在下列任何案例中使用擴充方法:

  • 若要提供協與每個介面實作相關的協助程式功能,請假設可根據核心介面撰寫上述功能。 原因是無法將具體實作指派給介面。 例如,LINQ to Objects 運算子會實作為所有 IEnumerable<T> 類型的擴充方法。 因此,任何 IEnumerable<> 實作都會自動啟用 LINQ。

  • 當執行個體方法導入某些類型的相依性時,這類相依性會中斷相依性管理規則。 例如,從 StringSystem.Uri 的相依性可能不需要,因此傳回 System.UriString.ToUri() 執行個體方法對相依性管理而言為錯誤設計。 傳回 System.Uri 的靜態擴充方法 Uri.ToUri(this string str) 會是較佳的設計。

❌ 避免在 System.Object 上定義擴充方法。

VB 使用者將無法使用擴充方法語法,在物件參考上呼叫這類方法。 VB 不支援呼叫這類方法,因為在 VB 中,將參考宣告為物件時會強制將物件參考上的所有方法調用成為晚期繫結 (實際的呼叫成員取決於執行階段),而繫結至擴充方法則取決於編譯時間 (早期繫結)。

請注意,當存在相同繫結行為或不支援擴充方法時,指導方針適用於其他語言。

❌ 請不要將擴充方法放在與擴充型別相同的命名空間中,除非目的為將封法新增至介面或相依性管理。

❌ 請避免使用相同簽章定義兩個或多個擴充方法,即使這些擴充方法位於不同的命名空間亦是如此。

✔️ 如果型別為介面且擴充方法應用於大部分或所有案例中,請考慮在與擴充型別相同的命名空間中定義擴充方法。

❌ 請不要定義在命名空間實作功能的擴充方法,因為通常會與其他功能相關。 相反地,請在與其所屬功能相關聯的命名空間定義。

❌ 請避免專用於擴充方法的命名空間泛行命名 (例如 "Extensions")。 請改為使用描述性名稱 (例如 "Routing")。

Portions © 2005, 2009 Microsoft Corporation. 著作權所有,並保留一切權利。

獲 Pearson Education, Inc. 的授權再版,從 Krzysztof Cwalina 和 Brad Abrams 撰寫,並在 2008 年 10 月 22 日由 Addison-Wesley Professional 出版,作為 Microsoft Windows Development Series 一部份的 Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition 節錄。

另請參閱