2012-10-31 12 views
18

自分のカスタムGenericCollectionクラスを設計する必要があります。今では、IEnumerable,ICollection、およびIListを使用して派生するオプションがたくさんあります。後でいくつかの機能が追加されています。IEnumerableとICollection対ILolistを使用したカスタムコレクション

私は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; 
    //... 
} 

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

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

私はいくつかの既存の投稿を見直しましたが、必要な情報を提供していません。

Returning 'IList' vs 'ICollection' vs 'Collection'

+0

最初の例では、_listメンバーを持つ必要はありません。さらに、IListを継承し、IListに関してpublicインターフェイスを実装する場合には、まだいくつかのストレージメカニズムを実装する必要があります –

答えて

37

IEnumerableICollection、及びIListIプレフィックスを持つ一般的には、任意のタイプ)だけinterfacesあります。彼らはあなたのクラスが何をするのかを公開させますが、あなたがinheritクラスの場合とは異なり、インターフェイスはあなたがしなければならないことのいずれかのデフォルト実装を提供しません。

は限りインターフェース、ここではクイックガイドが選んだとして:

  • IListは、インデックスによってアクセスすることができますICollectionです。
  • ICollectionは、Add,RemoveおよびCountのようなものに簡単にアクセスできるIEnumerableです。
  • IEnumerableは、それらの列挙が列挙されるまでそれらの一覧が存在しない場合でも、列挙できるものです。 IList<T>を実装

あなたのコレクションのためにあなたが延長(またはロジックのほとんどを実行しますプライベートフィールドとして維持)することがありますいくつかのクラスはCollection<T>List<T>されている、(が、実装をオーバーライドに簡単にアクセスして、ご覧くださいこれら2つの大きな違いはCollection<T> versus List<T> what should you use on your interfaces?)、またはリストではないコレクション(Dictionary<T, U>HashSet<T>など)。これらのいずれかの詳細については、クラスのMSDNドキュメントを参照してください。

0

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

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

1

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

パフォーマンス的には、機能に必要なものに重点を置いています。確実に知る唯一の方法は、測定することです。

+0

誤ってpublicリストを追加しました。 3つのインターフェイスをすべて実装することは何ですか?そして、もし私が機能だけに焦点を当てるならば、リストを追加して機能を提供する準備ができて行くこともできます。しかし、私はIEnumerable があれば、いくつかの強力な理由を探していますか? –

+0

IlistはIEnumerableを実装しているため、IListを実装する場合は明示的に実装する必要はありません。私はちょうどどちらか/または質問ではないと言うことを意味した。 – Rik

関連する問題