Microsoftは、作成するクラスに拡張メソッドを使用するのはなぜですか?メソッドをクラスに追加するだけでなく、子クラスを作成するのではなく、Microsoftが独自のクラスに拡張メソッドを使用するのはなぜですか?
答えて
Microsoftがこれを行った理由はたくさんあります。 2つの最大の存在:
拡張メソッドは、クラスだけでなくインターフェイスにも適用されます。 MicrosoftがLinqメソッドをIEnumerableに直接追加しただけであれば、それらのメソッドを実装するためには、そのインターフェイスのあらゆる具体的な実装が必要でした。既存のIEnumerable <>ビヘイビアの形で記述された拡張メソッドを作成することにより、すべてのIEnumerable <>クラスがそれらを自動的に取得します。
3.0および3.5フレームワークでは、コアSystem.dllは2.0ライブラリです。 System.Coreや他の関連ライブラリで3.0の新しい3.5のすべてが追加されました。たとえば、リストにある<クラスの新しいメソッドを取得する唯一の方法は、3.5には存在しますが2.0には存在しません.3.5ライブラリで拡張メソッドを使用することです。
RouteCollection
で
また、eric lippert [これについてブログしました](http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx) – bottlenecked
私の2セント:
拡張メソッドのみの.NETフレームワークのそれ以降のバージョンで追加されたので、彼らはすでに.NETフレームワーク1、1.1、2.0以降は、次に、いくつかの点で彼らに拡張メソッドを追加しましたそれらを使用して既存のクラスの上にフィーチャーセットを豊かにしました。
なぜこれが理由ですか? Linq拡張メソッドを見てみましょう。 linqメソッドを使用するには、.NET Framework 3.5以降を使用する必要があります。あなたは.Net 1、1.1、または2.0を使い続けることはできず、とにかくlinqメソッドを使います。だからあなたは.Net 3.5に移行しなければならず、linqがListなどのクラスで実装されていても、mylist.Where()。Select()... –
IgnoreRoute()
それはMVCフレームワークではなく、コアASP.NETアプリケーションで使用するために意図されているため、拡張メソッドです。私の推測では、RouteCollection
クラスを、MVC以外のアプリケーションでは不要なメソッドで汚染したくないと思っていたのですが、MVCアプリケーションでクラスを利用できるようになりました。
私は、このアプローチが必ずしも意味をなさないとは思っていません(例えば、子クラスを作成したばかりなので)。拡張メソッドが使用される可能性があるより一般的な理由から、他の人がうまく答えています。
MVCは.NET 2 - > 3のような別のケースです強化。ほとんどの基本クラスはMVC以外のASP.NETと同じですが、MVCフレームワークではMVC機能を使用して同じクラスを「うまく動作させる」ことを望んでいます。子クラスを派生させることは技術的にはうまくいくが、「哲学的には間違っている」のである。実際には2つのRouteCollectionクラスは存在しない。 1つのクラスがあり、MVCフレームワークに「アップグレード」すれば、よりスマートになります。 –
これは、Non-Virtual Interfaceパターンの例です(Template Methodに似ています)。これは、複数の(実装)継承を持つ言語で使用されるパターンであり、C#でそれを行う方法は拡張メソッドを使用することです。
基本的な考え方は、非仮想および純粋仮想(抽象)メソッドのみを使用することです。インターフェイスの実装者(またはクラス/ mixinの継承者、複数の継承を持つ言語)は、小さなメソッドまたはメソッドのセット(この場合はGetEnumerator)を実装し、それに応じて、
Michael Edenfieldが答えたところでは、このパターンを念頭に置いてIEnumerableをインターフェイスにしたい場合は、拡張メソッドを使用する必要があります。そして、IEnumerableを抽象クラスにすることは、非常に低コストで基本的なインターフェースであると考えられています。IEnumerableを実装すると、クラス階層を再考する必要はありません。 "
主な理由は、そのようなメソッドを拡張するのは非常に簡単だと思います。例えば、Linqの拡張メソッドの場合は、あなた自身の拡張メソッド(おそらくforeachまたは特定のフィルタ)を簡単に書くことができます。これは、Microsoftメソッドでgreateを実行します:mylist.Where(...)。MyFilter(...)。選択(...)
- 1. 拡張クラス内の拡張メソッド自体を使用して
- 2. 独自のメソッドでUIAElementArrayを拡張することはできますか?
- 3. クラスを拡張するのはなぜですか?
- 4. 生成された.netクラスを使用して、独自のクラスを拡張します。の仕方?
- 5. 拡張メソッドでIoCを使用する
- 6. Goは独自のコードジェネレータを使用するのはなぜですか?
- 7. wxWidgets型を独自のクラスで使用するには?
- 8. ColdFusion:独自の「独自のJavaクラス」の使用について
- 9. PHPプライベート変数が拡張クラスで動作するのはなぜですか?
- 10. CKEditorプラグインを独自の言語ファイルで拡張する
- 11. 私のasp.netページでchrome拡張メソッドを使用するには?
- 12. Twitterで独自のブートストラップを使用しないのはなぜですか?
- 13. いくつかのJavaコードでは、DeckクラスがCardクラスを拡張するのはなぜですか?
- 14. なぜormliteに独自の注釈があるのですか?
- 15. 静的クラスを拡張する拡張メソッド
- 16. 変換クラスの拡張性(拡張メソッドとParitalクラス)
- 17. JetbrainsがIDEで使用するために独自のJDKをインストールするのはなぜですか?
- 18. 拡張メソッドの使用が良い方法ですか?
- 19. Microsoftには独自の外部グリッドコントロールがありますか?
- 20. 私の拡張CodeIgniterの2.0.2クラスは、それが親クラスのメソッド
- 21. なぜObjective Cファイルに.m拡張子を使用するのですか?
- 22. "java"コマンドで.class拡張子を使用しないのはなぜですか?
- 23. モジュールの '自己'メソッドがなぜクラスのシングルトンメソッドになれないのですか?
- 24. モジュラー拡張メソッドを使用するクラスのクリーンコードを書くにはどうすればよいですか?
- 25. UIComponent拡張クラスにUIComponent拡張クラスが表示されない
- 26. なぜ自分のユーザーコントロールライブラリに独自のタブがないのですか?
- 27. LINQメソッドは拡張メソッドですか?
- 28. 変更可能なクラスで拡張メソッドを使用することは可能ですか?
- 29. なぜNettyには独自のConcurrentHashMapがありますか?
- 30. なぜアクティビティを拡張し、openFileInputを使用するメソッドを呼び出すクラスをインスタンス化すると、NULLポインタ例外が発生するのですか?
一般的にこれに答えることは非常に難しいでしょう。具体的な例を挙げてください。 –
これを以下に述べましたが、 'RouteCollection'コレクションの' IgnoreRoute() 'メソッド –