備註
此內容經Pearson Education, Inc.授權從架構設計指導方針:可重複使用 .NET 程式庫的慣例、習慣用語與範式 (第2版)轉載。 該版於2008年出版,該書自那以後已於 第三版全面修訂。 此頁面的某些資訊可能已過期。
擴充方法是一種語言功能,允許使用實例方法呼叫語法呼叫靜態方法。 這些方法至少必須採用一個參數,代表方法要運作的實例。
定義這類擴充方法的類別稱為「贊助者」類別,而且必須宣告為靜態。 若要使用擴充方法,必須匯入定義贊助者類別的命名空間。
❌ 避免輕率地定義擴充方法,特別是在您不擁有的類型上。
如果您確實擁有類型的原始程式碼,請考慮改用一般實例方法。 如果您不擁有 ,而且您想要新增方法,請非常小心。 自由使用擴充方法可能會使原本設計時不考慮這些方法的類型 API 變得混亂。
✔️ 請考慮在下列任何案例中使用擴充方法:
若要提供與介面每個實作相關的協助功能,假如該功能可以基於核心介面撰寫。 這是因為無法將具體實作指派給介面。 例如,
LINQ to Objects運算符會實作為所有 IEnumerable<T> 型別的擴充方法。 因此,任何IEnumerable<>實作都會自動啟用LINQ。當實例方法引入某類型的相依性時,而該相依性會破壞相依性管理規則。 例如,從 String 到 System.Uri 的相依性可能不理想,因此,從相依性管理的觀點來看,
String.ToUri()實例方法傳回System.Uri會是錯誤的設計。 靜態擴充方法Uri.ToUri(this string str)傳回System.Uri會是更好的設計。
❌ 避免在 System.Object 上定義擴充方法。
VB 使用者將無法使用擴充方法語法在對象參考上呼叫這類方法。 VB 不支援呼叫這類方法,因為在 VB 中,將參考宣告為 Object 會強制其上的所有方法調用延遲系結(實際呼叫的成員是在運行時間決定),而擴充方法的系結是在編譯時期決定的(早期系結)。
請注意,指導方針適用於有相同系結行為的其他語言,或不支援擴充方法。
❌ 請勿將擴充方法放在與擴充型別相同的命名空間中,除非將方法新增至介面或相依性管理。
❌ 避免使用相同的簽章定義兩個或多個擴充方法,即使它們位於不同的命名空間中也一樣。
✔️ 如果類型是介面,而且擴充方法應該用於大部分或所有案例,請考慮在與擴充型別相同的命名空間中定義擴充方法。
❌ 請勿在通常與其他功能相關的命名空間中定義擴充方法以實作功能。 相反地,請在與其所屬功能相關聯的命名空間中定義它們。
❌ 避免專用於擴充方法的命名空間泛型命名(例如「擴充功能」)。 請改用描述性名稱(例如「路由」)。
© 2005年、2009年Microsoft公司部分。 保留所有權利。
經 Pearson Education, Inc. 許可重新刊登自 Krzysztof Cwalina 和 Brad Abrams 所著的 架構設計指導方針: 可重複使用的 .NET 程式庫慣例、慣用語和模式,第 2 版,2008 年 10 月 22 日由 Addison-Wesley Professional 發行,作為 Microsoft Windows 開發系列的一部分。