我知道IList是接口,List是具体类型,但我仍然不知道何时使用每一个。我现在做的是,如果我不需要Sort或FindAll方法,我使用接口。我说的对吗?是否有更好的方法来决定何时使用接口或具体类型?


当前回答

我不认为这类事情有严格的规则,但我通常会遵循使用尽可能轻松的方式的指导方针,直到绝对必要的时候。

例如,假设您有一个Person类和一个Group类。Group实例有很多人,所以这里使用List是有意义的。当我在Group中声明列表对象时,我将使用IList<Person>并将其实例化为list。

public class Group {
  private IList<Person> people;

  public Group() {
    this.people = new List<Person>();
  }
}

而且,如果你甚至不需要IList中的所有东西,你也可以使用IEnumerable。对于现代的编译器和处理器,我不认为它们真的有任何速度上的差异,所以这只是风格的问题。

其他回答

IEnumerable 您应该尝试使用最不特定的类型来满足您的目的。 IEnumerable没有IList那么具体。 当您希望循环遍历集合中的项时,可以使用IEnumerable。

IList IList实现了IEnumerable。 当你需要通过索引访问你的集合,添加和删除元素等时,你应该使用IList。

列表 List实现了IList。

我不认为这类事情有严格的规则,但我通常会遵循使用尽可能轻松的方式的指导方针,直到绝对必要的时候。

例如,假设您有一个Person类和一个Group类。Group实例有很多人,所以这里使用List是有意义的。当我在Group中声明列表对象时,我将使用IList<Person>并将其实例化为list。

public class Group {
  private IList<Person> people;

  public Group() {
    this.people = new List<Person>();
  }
}

而且,如果你甚至不需要IList中的所有东西,你也可以使用IEnumerable。对于现代的编译器和处理器,我不认为它们真的有任何速度上的差异,所以这只是风格的问题。

一个List对象允许你创建一个列表,添加东西到它,删除它,更新它,索引到它等等。当你只想要一个泛型列表时,List就会被使用,你可以在其中指定对象类型。

另一方面,IList是一个接口。基本上,如果您想创建自己的自定义列表,比如一个名为BookList的列表类,那么您可以使用接口为您的新类提供基本方法和结构。IList用于当你想创建自己的特殊子类来实现List时。

另一个区别是: IList是一个接口,不能被实例化。List是一个类,可以实例化。它的意思是:

IList<string> list1 = new IList<string>(); // this is wrong, and won't compile

IList<string> list2 = new List<string>();  // this will compile
List<string> list3 = new List<string>();   // this will compile

你应该只在你需要它的时候使用这个接口,例如,如果你的列表被强制转换为一个IList实现而不是list。这是真的,例如,当你使用NHibernate,它在检索数据时将列表转换为NHibernate包对象。

如果List是您将用于某个集合的唯一实现,则可以将其声明为具体的List实现。

使用最低基类型总是最好的。这使接口的实现者或方法的使用者有机会在幕后使用他们喜欢的任何东西。

对于集合,应该尽可能使用IEnumerable。这提供了最大的灵活性,但并不总是适合。