2017-05-10 5 views
9

について混乱し、私はMicrosoftのGuidelines for Collectionsを見ていると私は理解しにくい少数の部品を見つける:のMicrosoftのガイドライン:いくつかの部分

Xは、公開APIArrayListまたはList<T>を使用しないでください。これは、私がList<T>を返すことを避けるべきであるか、それともIEnumerable/IListとして返すことができますが、明示的にはList<T>ではありませんか?

✓パラメータタイプとして可能な限り特殊化されていないタイプを使用してください。ほとんどのメンバーはコレクションとしてパラメータを取ります。IEnumerable<T>インターフェイスを使用します。 ReSharperが「IEnumerableの複数の列挙」の可能性について不平を言ったのを見て、あらかじめ計算されたオブジェクトの有限集合(レイジーストリームではない)を期待していたときにはICollection<T>を受け取る(そして戻す)方が良い考えでした。そうじゃないの?

✓は、プロパティのCollection<T>又はCollection<T>のサブクラスを使用するか、読み取り/書き込みコレクションを表す値を返すようにしてください。 ICollection<T>を使用してみませんか?私はインターフェイスが具体的なクラスよりも好ましいと思った。

+0

これらのガイドラインは、2008年に書かれたもので、.NET 3.5およびC#3.0より新しいバージョンでは更新されていないことに注意してください。具体的には、C#4.0で2010年に共分散とコントラバナンスを導入する前にアドバイスを書いた –

答えて

7

これらのガイドラインは、パラメーターとして受け入れるものと戻り値の型として返されるものに柔軟性がある設計方法を促進するために存在します。

メソッドからList<T>を返すと、そのメソッドはでないものを返しません。List<T>です。これはいくつかのシナリオでは問題ありませんが、他のシナリオではうまくいかない場合がありますたとえば、特定の期間中にログインしたユーザーのコレクションを戻すメソッドを考えてみましょう。このメソッドがList<T>を返す場合は、Listのセマンティクスであるため、すべてのユーザーを取得して返す必要があります。メソッドが返されるとすぐに合計数を持つすべてのアイテムを取得します。ユーザー数が数万人の場合、すべてのレコードを取得するのに時間がかかり、大量のメモリが必要になる可能性があります。

IEnumerable<T>が返される場合、呼び出し元はアイテムのコレクションを繰り返し処理できますが、すべてのアイテムを一度に取得することはできません。これにより、呼び出されたメソッドは、小さなバッチのデータを収集し、要求されたとおりに1つずつ返すオブジェクト(IEnumerable<T>の実装)を返すことができます。

また、多くの異なるコレクション型はIEnumerable<T>を実装しているため、このメソッドの別の実装では実際にIEnumerable<T>にキャストされたリストインスタンスを返すことになる場合があります。呼び出しメソッドは、それが期待するものはIEnumerable<T>なので、わからないか気にしません。ハードコーディングされたリストタイプの場合はそうではありません。できるだけ具体的なものであるため、他のものと交換することはできません。

一般に、ジェネリックコレクションインターフェイスは、任意のメソッドの最も柔軟な入力パラメータ/戻り値の型になります。インターフェイスを使用すると、さまざまな方法で実装したり、模擬したりすることができます渡されるものや返されるものを制御する柔軟性があります。また、インタフェースは、必ずしも製品が進化するにつれて不都合になるかもしれない意味上の制限をもたない(必然的に)。

最初のアドバイスとして、ArrayListは、.NET 2.0の後で使用すべきではない恐ろしいタイプです。ジェネリックタイプは可能な限りあらゆる点で優れているためです。

関連する問題