返回ICollection优于List 的优点是什么

可能重复:
List(of T)和Collection(of T)有什么区别?

我有一个静态类和一个getter来返回我的List Collection。 现在我读了并被告知要返回ICollection而不是List。 使用公共静态ICollection而不是公共静态List有什么好处?

static class Storage { private static List store; static Storage() { store = new List(); } public static ICollection getList { get { return store.AsReadOnly(); } } public static void addString(string add) { store.Add(add); } public static void removeString(string remove) { store.Remove(remove); } public static void display() { foreach (String view in store) { Console.WriteLine(view); } } } 

}

  • IEnumerable提供对一系列T对象的仅向前游标的访问
  • ICollection提供与IEnumerable相同的但也是Count属性(意味着该集合具有明确的结束)
  • IList提供与ICollection相同的function,但也可以通过索引器随机访问列表中的任何元素( list[5]

List实现了以上所有function。

使用更简单的接口作为参数或返回值的好处是它为调用者提供了更大的灵活性,并且可以帮助记录对象的使用方式(或者用于返回值的情况)。

这是一种很好的做法,也更易于维护。 如果使用接口而不是类型,则代码不会硬编码为该类型( List )。

示例:假设您稍后决定更改Storage类以将数据保存在另一种类型的存储中(即数据库,XML等)您可以使用Entity Framework连接到数据库,或者您可能使用LINQ-to-objects 。

实际上,您可能需要考虑使用IEnumerableIEnumerable 。 这些类型与LINQ以及大多数其他类型的集合一起工作。 因此,您可以在不更改返回类型的情况下转换到LINQ,并重新处理处理Storage类的所有代码。

而且,也许string也不是最佳选择? 你在collections什么? 也许你应该为你正在存储的对象创建一个类(即Name )。 然后你想要返回一个IEnumerable

 class Name { public string Name { get; set; } } 

稍后您可能希望将FirstNameLastName访问权限添加到您的类:

 class Name { public string Name get { return string.Format("{0} {1}", FirstName, LastName); } public string FirstName { get; set; } public string LastName { get; set; } } 

通过使用IEnumerable您不必更改任何消耗代码来执行此操作 – 只要您支持Name类的原始接口,就可以添加额外的function而不会破坏任何内容。

现在,如果您迁移到其他返回类型,您还应该考虑将处理Storage所有代码迁移到新类型。 当您在代码中的任何位置烘焙“存储类型”时,您将更难以进行更改。 您现在可能不会理解这一点,但随着您成为更好的程序员或发现自己未来的更改,您将看到使用允许更改基础类型的界面的好处。 当您选择对象类型并在第一个修订版中容纳它们时,请尝试预测未来的可能性,以便稍后添加时节省您的头痛。

如果您问为什么要在对象上返回接口,那么接口会描述对象的作用以及如何使用它,而不是需要特定的实现。 它使代码更通用。

如果你问的是为什么是Collection而不是List,那么集合并不意味着一个List而是一个List。 技术术语是集合“较弱”,因此适用于更多情况。 如果您不需要订购,请使用Collection。 否则,请使用List。