4

重複の可能性:
拡張メソッドのどのような利点を見つけましたか?

わかりました、まず第一に、これは物議をかもすように聞こえますが、対立するつもりはありません。私は純粋な好奇心から真剣な質問をしています (あるいは困惑という言葉の方が適切かもしれません)。

拡張メソッドが .NET に導入されたのはなぜですか? 見栄えを良くすること以外に、それらはどのような利点を提供しますか (「いい」とは、「インスタンスメソッドのように見える」ことを意味します)。

私にとって、次のような拡張メソッドを使用するコード:

Thing initial = GetThing();
Thing manipulated = initial.SomeExtensionMethod();

SomeExtensionMethodは、が のインスタンス メンバーであることを暗示しているため、誤解を招く可能性があります。これは、(1)がおそらく効率的に実装Thingされていると開発者を誤解させます (少なくとも直感として... あなたはそれを否定するかもしれませんが、私は間違いなくこれを観察しました) 。 SomeExtensionMethod(2)実際にはクラスの一部SomeExtensionMethodように見えるので、将来のある時点で改訂されたとしても、確かに有効なままです(作者が自分が何をしているのかを知っている限り).ThingThingThing

しかし実際には、拡張メソッドは、保護されたメンバーや、拡張しているクラスの内部動作にアクセスできないため、他の静的メソッドと同じように破損する傾向があります。

上記が簡単に次のようになることは誰もが知っています。

Thing initial = GetThing();
Thing manipulated = SomeNonExtensionMethod(initial);

私には、正直なところ、より良い言葉がないため、これはもっと多くのように思えます

私は何が欠けていますか?拡張メソッドが存在する理由

4

6 に答える 6

14

メソッドチェーンを使用して、Linq をクリーンな方法で動作させるには、拡張メソッドが必要でした。「長い」形式を使用する必要がある場合、関数呼び出しとパラメーターが互いに分離され、コードが非常に読みにくくなります。比較:

IEnumerable<int> r = list.Where(x => x > 10).Take(5)

// What does the 5 do here?
IEnumerable<int> r = Enumerable.Take(Enumerable.Where(list, x => x > 10), 5);

他のものと同様、悪用される可能性もありますが、拡張メソッドは適切に使用すると非常に便利です。

于 2009-11-18T22:30:21.543 に答える
6

主な利点は見つけやすさだと思います。タイプinitialしてドットを打てば、それでできることはすべてそこにあります。あるクラスの別の場所に隠されている静的メソッドを見つけるのははるかに困難です。

于 2009-11-18T22:30:46.587 に答える
3

まず、Thing manipulated = SomeNonExtensionMethod(initial);ケースでは、 SomeNonExtensionMethod は、ケースとまったく同じ仮定に基づいていThing manipulated = initial.SomeExtensionMethod();ます。物事は変わる可能性があり、SomeExtensionMethod は壊れる可能性があります。それが私たちプログラマーの命です。

第 2 に、 を参照Thing manipulated = initial.SomeExtensionMethod();しても、 SomeExtensionMethod() が実装されている場所が正確にわかりません。Thing は、TheOriginalThing から継承する TheThing から継承できます。したがって、「誤解を招く」議論はどこにもつながりません。IDE が適切な情報源へと導いてくれるに違いありません。

何がすごいの?コードの一貫性が向上します。文字列で機能する場合、文字列のメンバーであるかのように見えます。いくつかのメソッドと別のクラスのMyThing.doThis()いくつかのメソッドを持つのは醜いです。static ThingUtil.doSomethingElse(Mything thing)

于 2009-11-18T22:34:09.270 に答える
0

SO 他の人のクラスを拡張できます。あなたのものではありません... それが利点です。(そして、あなたは言うことができます..ああ、彼らがこれ/あれを実装してくれたらいいのに....あなたは自分でそれをしてください..)

于 2009-11-18T22:30:12.657 に答える
0

クラスが明示的に再実装しなくても、クラスが継承するインターフェイスに基づいて機能を自動的に混合するのに最適です。

Linq はこれをよく利用します。

追加機能でクラスを装飾する優れた方法。特定のクラスではなくインターフェイスに適用すると最も効果的です。ただし、Framework クラスを拡張する良い方法です。

于 2009-11-18T22:35:22.703 に答える
0

実際にクラスの一部であるかどうかに関係なく、同じ構文でメソッドを呼び出すことができるようにするための便利な構文糖衣です。パーティ A がライブラリをリリースし、パーティ B がそのライブラリを使用するものをリリースする場合、class.method(args) ですべてを呼び出す方が、method(class, args) と class.method で呼び出されるものを覚えておく必要があるよりも簡単です。 (引数)。

于 2009-11-18T22:38:30.013 に答える