IList<>
インターフェースです。List<>
具体的なクラスです。
これらのいずれかが有効になります。
IList<Employee> EmpList = new List<Employee>();
と
List<Employee> EmpList = new List<Employee>();
また
var EmpList = new List<Employee>(); // EmpList is List<Employee>
ただし、インターフェースをインスタンス化することはできません。つまり、以下は失敗します。
IList<Employee> EmpList = new IList<Employee>();
一般に、依存関係(コレクションなど)を使用するクラスとメソッドは、可能な限り制限の少ないインターフェース(つまり、最も一般的なインターフェース)を指定する必要があります。たとえば、メソッドがコレクションを反復処理する必要がある場合は、次のIEnumerable<>
ようになります。
public void IterateEmployees(IEnumerable<Employee> employees)
{
foreach(var employee in employees)
{
// ...
}
}
一方、消費者がCount
プロパティにアクセスする必要がある場合(を介してコレクションを繰り返す必要があるのではなくCount()
)、aICollection<T>
以上IReadOnlyCollection<T>
がより適切であり、同様に、またはをIList<T>
介してコレクションにランダムアクセスする必要がある場合にのみ必要になります。[]
コレクションに新しいアイテムを追加または削除する必要があります。