28

GenericCollection独自のカスタムクラスを設計する必要があります。IEnumerable今、私は、、、ICollectionおよびを使用してそれを導出するための多くのオプションがありIList、後でいくつかの追加機能を提供します。

IEnumerable<T>この場合のように、実際にコレクションを保持するためにオブジェクトを宣言する必要があるかもしれないと私は少し混乱しています_list

public class GenericCollection<T> : IEnumerable<T>
{
    private List<T> _list;
    //...
}

しかし、ICollection<T>またはを使用する場合は、暗黙的に使用可能であるため、オブジェクトIList<T>を宣言する必要はありません。List

public class GenericCollection<T> : IList<T>
{
    // no need for List object
    //private List<T> _list; 
    //...
}

パフォーマンスに関して、これら2つのアプローチの違いは何ですか?

どのシナリオでは、特に独自のコレクションをデザインする場合に、それぞれが優先されます。パフォーマンスの良い軽量コレクションに興味があります。これはを使用して達成できると思いますが、それを使用IEnumerable<T>するいくつかの強力な理由とどの程度正確に一致しますか?

いくつかの既存の投稿を確認しましたが、必要な情報を提供しているものはありません。

'IList' vs'ICollection'vs'Collection'を返す

4

3 に答える 3

65

IEnumerable、、、ICollectionおよびIList(通常、Iプレフィックスが付いた任意のタイプ)は単なるインターフェイスです。クラスが何をするかを公開できますが、クラスを継承する場合とは異なり、インターフェイスは、実行する必要があると言われていることのデフォルトの実装を提供しません。

どのインターフェースを選択するかに関しては、ここにクイックガイドがあります:

  • AnIListは、ICollectionインデックスでアクセスできるanです。
  • AnICollectionは、、、、などにIEnumerable簡単にアクセスできるです。AddRemoveCount
  • AnIEnumerableは、列挙するまでそれらのリストが存在しない場合でも、列挙できるものです。

コレクション用に拡張(またはほとんどのロジックを実行するプライベートフィールドとして保持)する可能性のあるいくつかのクラスは、、(List<T>実装Collection<T>IList<T>ますが、オーバーライドする実装に簡単にアクセスできます。Collection <T>とList<T>を参照してください。これら2つの間の大きな違いについては、インターフェイスで何を使用する必要がありますか? 、またはのようなリストでObservableCollection<T>はないコレクション。これらの詳細については、クラスのMSDNドキュメントを参照してください。Dictionary<T, U>HashSet<T>

于 2012-10-31T11:57:29.050 に答える
1

まず、これらのインターフェイスから実際に選択する必要はありません。必要な場合は、3つすべてを実装できます。次に、IEnumerableを実装するために、基になるリストを公開する必要はありません。基になるリストの列挙子を使用するメソッドだけを実装できます。

パフォーマンス面では、機能的に必要なものに焦点を当てて、大きな影響があるとは思えません。確実に知る唯一の方法は、測定することです。

于 2012-10-31T11:51:59.800 に答える
0

パフォーマンスは、実装されているインターフェイスに依存する可能性はほとんどありません。それはむしろ、特定の目標を達成するためにプロセッサが実行しなければならない命令の数に依存します。IEnumerableを実装してリストをラップすると、リストへの呼び出しを伝播するだけのAdd / Remove / this []メソッドを記述してしまう可能性があり、パフォーマンスのオーバーヘッドが追加されます。したがって、私は測定を行いませんでしたが、継承アプローチの方が少し速い可能性があります。

ただし、このような詳細は通常、考えられるすべてのCPUサイクルを節約する必要があるリアルタイムアプリケーションにのみ関係します。Eric Lippertには、このような詳細に注意を払うことについてのすばらしい記事があります:http: //blogs.msdn.com/b/ericlippert/archive/2003/10/17/53237.aspx。一般に、パフォーマンスの詳細よりも、アプリケーションのビジネスロジックとアーキテクチャにより適したアプローチを使用する方が適切である可能性があります。

于 2012-10-31T11:50:48.677 に答える