注
このコンテンツは、 フレームワーク設計ガイドライン (再利用可能な .NET ライブラリの規則、イディオム、パターン、第 2 版) から、Pearson Education, Inc. のアクセス許可によって再印刷されます。 そのエディションは2008年に出版され、その後 、本は第3版で完全に改訂されています。 このページの情報の一部が古くなっている可能性があります。
拡張メソッドは、インスタンス メソッド呼び出し構文を使用して静的メソッドを呼び出す言語機能です。 これらのメソッドは、メソッドが操作するインスタンスを表す少なくとも 1 つのパラメーターを受け取る必要があります。
このような拡張メソッドを定義するクラスは "スポンサー" クラスと呼ばれ、静的として宣言する必要があります。 拡張メソッドを使用するには、スポンサー クラスを定義する名前空間をインポートする必要があります。
❌ 特に所有していない型では、拡張メソッドを軽蔒的に定義しないでください。
型のソース コードを所有している場合は、代わりに通常のインスタンス メソッドを使用することを検討してください。 所有していない場合や、メソッドを追加したい場合は、非常に注意してください。 拡張メソッドを自由に使用すると、これらのメソッドを使用するように設計されていない型の 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 では、参照を Object として宣言すると、すべてのメソッド呼び出しが遅延バインド (実際のメンバーの呼び出しは実行時に決定されます) が、拡張メソッドへのバインドはコンパイル時 (早期バインド) に決定されるため、このようなメソッドの呼び出しはサポートされていません。
このガイドラインは、同じバインド動作が存在する他の言語、または拡張メソッドがサポートされていない言語に適用されることに注意してください。
❌ 拡張メソッドを拡張型と同じ名前空間に配置しないでください。ただし、メソッドをインターフェイスに追加したり、依存関係管理を行ったりする場合を除きます。
❌ 異なる名前空間に存在する場合でも、同じシグネチャを持つ 2 つ以上の拡張メソッドを定義することは避けてください。
✔️ 型がインターフェイスであり、拡張メソッドがほとんどの場合またはすべてのケースで使用される場合は、拡張型と同じ名前空間に拡張メソッドを定義することを検討してください。
❌ 通常、他の機能に関連付けられている名前空間に機能を実装する拡張メソッドを定義しないでください。 代わりに、属する機能に関連付けられている名前空間で定義します。
❌ 拡張メソッド専用の名前空間の一般的な名前付け (例: "Extensions") を回避します。 代わりにわかりやすい名前 ("ルーティング" など) を使用します。
Portions © 2005, 2009 Microsoft Corporation. 無断転載を禁じます。
フレームワーク設計ガイドライン:再利用可能な .NET ライブラリの規則、イディオム、パターン、Krzysztof Cwalina および Brad Abrams による第 2 版は、2008 年 10 月 22 日に Microsoft Windows 開発シリーズの一部として Addison-Wesley Professional によって公開されました。