特定のタイプのコレクションを取得する関数がある場合、どのパラメータータイプを使用する必要がありますか?
以前はデフォルトであると想定していましIEnumerable
たが、これが正しいかどうか、正しい場合はその理由を知りたいと思います。
ICollection
(その名前から)有効な候補のようにも見えますが、IEnumerablesの方がユーザーフレンドリーであるという印象を受けます。
フレームワークが提供する例を見るのは良い考えだと思いましたが、のようなものString.Join
が文字列の配列を要求していることがわかりました。
3 に答える
あなたはクライアントに最も負担をかけないがあなたがあなたの仕事を成し遂げることを可能にするものを取ります。IEnumerable<T>
以上を回避できる場合ICollection<T>
は、APIのクライアントにより大きな柔軟性を与えるため、これを使用する必要があります。
IEnumerableはICollectionsよりも優先されます。 これがあなたの質問に対する寛大な答えです。
インターフェイスは主に、関数のパラメータまたはリターンタイプとして使用され、キャストを容易にするための設計原則(インターフェイス分離の原則)をサポートし、インターフェイスされたパラメータへの複数の具象タイプの受け渡しと、クライアントからの実際のパラメータタイプの非表示(カプセル化)をサポートしますI
。SOLID
あなたのパブリック機能。
- について
IEnumerable
:
非常に基本的で、非ジェネリックコレクションに対する単純な反復をサポートする列挙子を公開します。
[ComVisibleAttribute(true)]
public interface IEnumerable
- これについて
ICollection
です:
ICollectionインターフェイスはIEnumerableを拡張します。IDictionaryとIListは、ICollectionを拡張するより特殊なインターフェイスです。IDictionaryの実装は、Hashtableクラスのように、キーと値のペアのコレクションです。IList実装は値のコレクションであり、そのメンバーはArrayListクラスのようにインデックスでアクセスできます。QueueクラスやStackクラスなど、要素へのアクセスを制限する一部のコレクションは、ICollectionインターフェイスを直接実装します。IDictionaryインターフェイスもIListインターフェイスも必要なコレクションの要件を満たしていない場合は、柔軟性を高めるために、代わりにICollectionインターフェイスから新しいコレクションクラスを派生させます。
[ComVisibleAttribute(true)]
public interface ICollection : IEnumerable
IList
インターフェースについては次のとおりです。[ComVisibleAttribute(true)]パブリックインターフェイスIList:ICollection、IEnumerable
IListに関するMSDNの詳細:
IList
はインターフェイスの子孫であり、ICollection
すべての非汎用リストの基本インターフェイスです。IListの実装は、読み取り専用、固定サイズ、可変サイズの3つのカテゴリに分類されます。読み取り専用のIListは変更できません。固定サイズのIListでは要素の追加や削除はできませんが、既存の要素の変更はできます。可変サイズのIListを使用すると、要素の追加、削除、および変更が可能になります。
ヒント:
foreach
コレクションパラメータをサポートしたいだけの場合は、IEnumerable
それで十分です。コレクションへのアイテムの追加と削除のサポートも必要な場合IList
は、より適切な選択です。
提案: このブログ投稿:IEnumerable、ICollection、IList Comparedは、より適切で正確な決定を下すのに確かに役立つはずです。
さらに、IListとIEnumerableのパフォーマンスおよびその他の比較については、この記事を参照してください。