7

重複の可能性:
C# - List<T> または IList<T>

クラスがあります

 public class Employee
 {
      public int Id { get; set; }
      public string Name { get; set; }
 }

そして、リストを定義する必要があります。以下の方法でリストを定義することの違いは何ですか

IList<Employee> EmpList ;

Or

List<Employee> EmpList ;
4

9 に答える 9

12

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>介してコレクションにランダムアクセスする必要がある場合にのみ必要になります。[]コレクションに新しいアイテムを追加または削除する必要があります。

于 2012-09-11T12:25:22.623 に答える
7

IList<T>によって実装されたインターフェイスですList<T>.

インターフェイスの具体的なインスタンスを作成することはできないため、次のようになります。

//this will not compile
IList<Employee> EmpList = new IList<Employee>();    

//this is what you're really looking for:
List<Employee> EmpList = new List<Employee>();

//but this will also compile:
IList<Employee> EmpList = new List<Employee>();
于 2012-09-11T12:24:54.647 に答える
6

ここに2つの答えがあります。実際のリストを保存するにはList<T>、具体的なデータ構造が必要なため、を使用します。ただし、プロパティから返す場合、または引数として必要な場合は、を検討してIList<T>ください。これはより一般的であり、引数としてより多くの型を渡すことができます。List<T>同様に、内部実装が変更された場合よりも多くの型を返すことができます。確かに、IEnumerable<T>代わりにリターンタイプのを検討することをお勧めします。

于 2012-09-11T12:25:42.967 に答える
2

Listオブジェクトを使用すると、リストの作成、リストへの追加、削除、更新、インデックス作成などを行うことListができます。オブジェクトタイプを指定する汎用リストが必要な場合は、それだけで済みます。

IList一方、インターフェースです。(インターフェイスの詳細については、MSDNインターフェイスを参照してください)。基本的に、ListSimpleListというリストクラスなど、独自のタイプを作成する場合は、インターフェイスを使用して、新しいクラスに基本的なメソッドと構造を与えることができます。IListを実装する独自の特別なサブクラスを作成する場合に使用しますListここで例を見ることができます

于 2012-09-11T12:28:01.977 に答える
2

違いを列挙するためにあなたに任せますが、おそらくいくつかの気の利いた反射がありますが、List<T>実装はいくつかのインターフェースを実装しておりIList<T>、それらの1つにすぎません:

[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>, 
    IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, 
    IEnumerable
于 2012-09-11T12:24:35.940 に答える
1

リストには多くの種類があります。それらのそれぞれはIListから継承します(それがインターフェースである理由です)。2つの例は、リスト(通常のリスト)とページングリスト(これはページングをサポートするリストです。ページングされた検索結果で一般的に使用されます)です。ページリストとリストはどちらもIListのタイプです。つまり、IListはリスト(ページリストの場合もあります)である必要はなく、その逆も同様です。

PagedListのこのリンクを参照してください。https://github.com/TroyGoode/PagedList#readme

于 2012-09-11T12:34:04.063 に答える
0

IListはインターフェースであり、Listはそれを実装するクラスであり、List型は非ジェネリックIListインターフェースを明示的に実装します。

于 2012-09-11T12:24:16.173 に答える
0

最初のバージョンはインターフェースへのプログラミングであり、推奨されます(IListで定義されたメソッドのみを使用する必要があると想定)。特定のクラスに基づいて宣言された2番目のバージョンは、不必要に厳格です。

于 2012-09-11T12:24:19.013 に答える
0

違いは、IListがインターフェースであり、Listがクラスであるということです。ListはIListを実装しますが、IListをインスタンス化することはできません。

于 2012-09-11T12:25:32.960 に答える