2

BCL クラスの多くには、メソッドと ExtensionMethods があります。Microsoft がクラスのソース コードを持っている場合、メソッドではなく ExtensionMethods を選択する設計上の決定は何ですか? ありがとう、スミス

4

3 に答える 3

9

実際、BCL の拡張メソッドのほとんどはクラスではなく、拡張メソッドの重要な機能であるインターフェイスに適用されます。

たとえば、ほとんどすべての LINQ to objects はIEnumerable<T>、クラスList<T>, HashSet<T>などではなく、インターフェイスの拡張機能として実装されています。

インターフェイスには機能がない (コントラクトのみ) ため、インターフェイスに拡張メソッドを追加すると、インターフェイス自体への道が開けます。これは、実装がそれを使用するためのインターフェースのみを知る必要があり、実装の詳細 (それ自体) を必要としない場合に特に便利です。

Microsoft常に BCL クラスに新しいメソッドを追加しています (もちろん、可能な限り重大な変更は避けています)。しかし、BCL での拡張メソッドの使用の大部分はインターフェイス上であり、クラス/構造体に直接新しいメソッドで簡単に追加できる機能を追加するためではないと思います。

つまり、要するに、Microsoft が単一のclass(または共通の基本クラスを持つファミリ) に機能を追加することを選択した場合、おそらくメソッドを直接追加するだけです (すべてが等しい場合)。特定のインターフェイスのすべての実装では、おそらくそのインターフェイスで拡張メソッドを使用します。

これも覚えておきましょう!Microsoft は拡張メソッドを提供してくれたので、Microsoft が作成していないクラスにも適用されます。たとえば、IEnumerable<T>共通の基本クラスなどを継承していなくても、実装するクラスを作成すると、LINQ の機能とボーナスが得られます。

于 2012-07-17T16:51:18.930 に答える
1

メソッドよりもExtensionMethodsを選択するための設計上の決定は何ですか

私の意見で拡張方法を選択する1つの強力な理由は、それがSOLIDのOpen/Closedプリンシパルを促進することです。

于 2012-07-17T16:54:35.587 に答える
0

Microsoft は、幅広いさまざまなコード ベースに適用される機能に拡張メソッドを使用する傾向があります。たとえば、LINQ はほぼ完全に拡張メソッドとして実装されています。(そして、指摘したメソッドのすべてではないにしても、ほとんどはジェネリック LINQ メソッドであり、それらのクラスに固有のものではありません)。

これには多くの利点があります。まず、LINQ を使用していない場合は、LINQ ライブラリへの参照や using を含める必要はありません。これにより、コードの肥大化が軽減されます。

次に、列挙子を実装する場合は、独自のコードを含め、IEnumerable を実装する任意のオブジェクトに LINQ を適用できます。他の方法で行う必要があるように、このコードを記述する必要はありません。

第 3 に、機能を個別のユニットに分割できるため、懸念事項がより適切に分離され、クラスがより保守しやすくなります。

他にも多くの潜在的な利点がありますが、拡張メソッドがこれらのメソッドを実装する最良の方法であることを明確にするためには、このリストで十分です。

于 2012-07-18T16:24:20.430 に答える