8

タイトルにあるように、ICollectionインターフェイスに Add メソッドが含まれていない理由を知っている人はいますか? ジェネリック バージョン にICollection<T>があるのにAddないICollectionのは非常に奇妙に思えます。これについてより深い知識を持っている人は誰でも本当に役に立ちます。

残念ながら、SharePoint を構築する開発者はジェネリックについて学んだことがないため、API のすべてのコレクションは .NET に基づいた非ジェネリック コレクションですICollectionICollectionとりわけ、コレクションへの追加を含むいくつかの拡張メソッドをアタッチしたいのですが、これは不可能のようです (少なくともリフレクションなしでは不可能です)。

編集:

かなりの数の人々がその理由を推測ICollection.AddしていますObject。そうではありません。IList 取るAddメソッドがありObjectます。を受け取るメソッドで型チェックとキャストを行うだけですObject

配列が実装するICollectionため、それを持つことができない引数は、Add水を保持しません。メソッドがある場合ICollectionは、Add配列に明示的に実装し、例外をスローする必要があります (配列実装の多くのメソッドが現在行っているように)。

誰かがデザイナーの一人による説明への参照を持っていることを本当に望んでいました.

4

8 に答える 8

2

私には、インターフェースの命名が期待を混乱させているようです。ICollection同じ継承チェーンにさえありICollection<T>ません - ほとんどのコレクションは単純に両方を実装しています。

ドキュメントにはインターフェースが何をするかが記載されているので、これだけではAdd存在するとは思わないでしょう:

すべての非ジェネリック コレクションのサイズ、列挙子、および同期メソッドを定義します。

私はどう思いますか?Add個人的には、それは単純なネーミングの失敗か、2 回目 (ジェネリック インターフェイスを導入するとき) にデザイナーが選択したかのどちらかだと思いますICollection<T>

IList持っていAddて継承しているのICollectionに対し、IList<T>持っていないAddで継承ICollection<T>していAddます。

型階層設計の進化・成熟まで考えてみてください。


拡張メソッドに関しては、次のようなことができます。

public static void AnotherMethod<T>(this ICollection<T> collection, T item) { }

そして、次のように使用します。

ICollection<string> s;
s.AnotherMethod("");
于 2012-07-27T14:51:16.127 に答える
1

ICollection何でもかまいません。それは数え切れないほどのものかもしれません。メソッド、または実際に. インターフェイスをよく見ると、ほとんど読み取り専用です。要素の数を確認したり、それらを列挙したりできます。それでおしまい。これは、抽象的な意味で完全に理にかなっています。AddRemove

に到達するとICollection<T>、非常に具体的になります。それが保持しているオブジェクトの種類を正確に知っているため、次のことができます。

  • の新しい要素を追加し<T>ます。
  • IEquitable一種のインターフェースを使用してそれらを検索します。
  • 同じ方法を使用して、それらを削除します。

本質的に、違いはそれICollection<T>がやや具体的であるということです。

于 2012-07-27T14:53:17.067 に答える
1

アルバハリ兄弟によると

ジェネリック バージョンと非ジェネリック バージョンは、特に ICollection の場合、予想以上に異なっています。

これの理由はほとんど歴史的なものです:ジェネリックは後で登場したため、ジェネリック インターフェイスは 後知恵の恩恵を受けて開発されました。

このために、

ICollection<T>伸びないICollection

IList<T>伸びないIList

IDictionary<TKey, TValue>伸びませんIDictionary

要約ICollection<T>すると、で行われた間違いをしないことで進化しました。これが、Add メソッドがあり、ないICollection理由です。ICollection<T>ICollection

于 2012-07-27T15:36:10.957 に答える
0

大まかな推測 - ICollection インターフェイスは、IList や IDictionary など、それを拡張する他のインターフェイスの基本インターフェイスです。これらのインターフェースには、add メソッドの異なる実装があります。IList は 1 つのパラメーターを取り、IDictionary は明らかに 2 つのパラメーターを必要とします。ジェネリックでは、派生インターフェイス メソッドのシグネチャは、1 つのパラメーター (型) を取るため、実際には違いはありません。

于 2012-07-27T14:54:23.220 に答える
0

が作成されたときICollection、ジェネリック インターフェイスはありませんでした。これは、Addメソッドが存在する場合ICollection、署名が必要であることを意味していましたAdd(object)ICollectionは、任意の型のコレクション間で一貫したインターフェイスを宣言することを目的としています。これにより、各コレクションが s のコレクションのように部分的に動作するようになりobjectます。

ICollection<T>これは、 メソッドを持つ で修正されましたAdd(T)

于 2012-07-27T14:55:30.637 に答える
0

MSDNから

他のコレクションまたはコレクション インターフェイスの代わりにポリモーフィックに使用する場合、既知の型にコレクション型を追加する必要はありません。たとえば、IEnumerable 型のデータ メンバーを宣言し、それを使用して ArrayList のインスタンスを送信する場合、既知の型に ArrayList を追加する必要はありません。

非コレクション型の代わりにコレクションをポリモーフィックに使用する場合は、それらを既知の型に追加する必要があります。たとえば、Object 型のデータ メンバーを宣言し、それを使用して ArrayList のインスタンスを送信する場合は、既知の型に ArrayList を追加します。

于 2012-07-27T14:50:45.497 に答える
0

Msdn定義に基づいて、それは

すべての非ジェネリック コレクションのサイズ、列挙子、および同期メソッドを定義します

つまり、ICollection は、読み取るストリーム または一連のデータを表します。おそらく、サーバーから読み取ったデータの一般的なストリームを提供することが決定の背後にある言え ます。SharePoint API

于 2012-07-27T14:51:30.443 に答える
0

1 つの推測では、ICollectionそのAdd方法があったとしたら、それには何が必要でしょうか? Objectもちろん。これは、C# 2.0 より前に発生した、ジェネリック配列がない場合の大きな問題でした。

問題は、同じコレクションに異なるタイプを追加できることです

于 2012-07-27T14:51:55.153 に答える