拡張メソッド
Note
このコンテンツは、Pearson Education, Inc. の許可を得て、『Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition (フレームワーク設計ガイドライン: 再利用可能な .NET ライブラリの規約、表現形式、およびパターン、第 2 版)』から転載されています。 この版は 2008 年に出版され、その後、この本は第 3 版で全面的に改訂されました。 このページの情報の一部は古くなっている可能性があります。
拡張メソッドは、インスタンス メソッド呼び出し構文を使用して静的メソッドを呼び出せるようにする言語機能です。 これらのメソッドでは、メソッドで操作されるインスタンスを表す 1 つ以上のパラメーターを使用する必要があります。
このような拡張メソッドを定義するクラスは "スポンサー" クラスと呼ばれ、静的クラスとして宣言する必要があります。 拡張メソッドを使用するには、スポンサー クラスを定義する名前空間をインポートする必要があります。
❌ 拡張メソッドをむやみに定義することは避けてください。これは自分が所有していない型に対して特に当てはまります。
型のソース コードを所有している場合は、代わりに通常のインスタンス メソッドを使用することを検討してください。 所有していないときにメソッドを追加する場合は、細心の注意を払ってください。 拡張メソッドを自由に使用すると、それらのメソッドを使用するように設計されていなかった種類の API が乱雑になる可能性があります。
✔️ 次のシナリオのいずれかに該当する場合に拡張メソッドの使用を検討してください。
インターフェイスのすべての実装に関連するヘルパー機能をコア インターフェイスの観点から記述できる場合に、その機能を提供するため。 これは、それ以外の方法では、明確な実装をインターフェイスに割り当てることができないことが理由です。 たとえば、
LINQ to Objects
演算子は、すべての IEnumerable<T> 型の拡張メソッドとして実装されます。 したがって、すべてのIEnumerable<>
の実装は、自動的に LINQ 対応になります。インスタンス メソッドによって何らかの種類の依存関係が発生するが、そのような依存関係は依存関係管理規則に違反する場合。 たとえば、String から System.Uri への依存関係はおそらく望ましいものではないため、
System.Uri
を返すString.ToUri()
インスタンス メソッドは、依存関係管理の観点からは不適切な設計になります。System.Uri
を返す静的な拡張メソッドUri.ToUri(this string str)
のほうが、はるかに優れた設計です。
❌System.Object に拡張メソッドを定義することは避けてください。
VB ユーザーは、拡張メソッドの構文を使用して、オブジェクト参照に対してそのようなメソッドを呼び出すことはできません。 VB では、このようなメソッドの呼び出しはサポートされていません。理由は、VB では、参照をオブジェクトとして宣言すると、それに対するすべてのメソッド呼び出しは遅延バインディングされます (呼び出される実際のメンバーは実行時に決定されます) が、拡張メソッドへのバインドはコンパイル時に決定 (事前バインディング) されるためです。
このガイドラインは、同じバインディング動作が存在する、または拡張メソッドがサポートされていない他の言語にも適用されることに注意してください。
❌ メソッドをインターフェイスに追加する、または依存関係を管理することが目的でない限り、拡張メソッドを拡張型と同じ名前空間に配置しないでください。
❌ 異なる名前空間に存在する場合でも、同じシグネチャを持つ 2 つ以上の拡張メソッドを定義することは避けてください。
✔️ 型がインターフェイスであり、ほとんどまたはすべてのケースで拡張メソッドを使用することを意図している場合は、拡張型と同じ名前空間に拡張メソッドを定義することを検討してください。
❌ 通常は他の機能に関連付けられている名前空間内に、機能を実装する拡張メソッドを定義しないでください。 代わりに、それらが属する機能に関連付けられている名前空間内に定義してください。
❌ 拡張メソッド専用の名前空間の汎用的な名前付け ("Extensions" など) は避けてください。 代わりに、わかりやすい名前 ("Routing" など) を使用してください。
Portions © 2005, 2009 Microsoft Corporation. All rights reserved.
2008 年 10 月 22 日に Microsoft Windows Development シリーズの一部として、Addison-Wesley Professional によって発行された、Krzysztof Cwalina および Brad Abrams による「Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition」 (フレームワーク デザイン ガイドライン: 再利用可能な .NET ライブラリの規則、用法、パターン、第 2 版) から Pearson Education, Inc. の許可を得て再印刷されています。