可能重复:
What is the difference between List (of T) and Collection(of T)?
我有一个静态类和一个getter来返回我的List Collection。现在我阅读并被告知返回ICollection而不是List。使用公共静态ICollection而不是公共静态List有什么好处?
static class Storage
{
private static List<string> store;
static Storage()
{
store = new List<string>();
}
public static ICollection<string> 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);
}
}
}
}
答案 0 :(得分:3)
IEnumerable<T>
提供对一系列T
个对象ICollection<T>
提供与IEnumerable<T>
相同的内容,但也提供Count
属性(意味着该集合具有明确的结尾)IList<T>
提供与ICollection<T>
相同的内容,但也可以通过索引器(list[5]
)随机访问列表中的任何元素 List<T>
实现了上述所有内容。
使用更简单的接口作为参数或返回值的好处是它为调用者提供了更大的灵活性,并且可以帮助记录对象的使用方式(或者用于返回值的情况) )。
答案 1 :(得分:2)
这是一种很好的做法,而且更易于维护。如果您使用的是接口而不是类型,那么您的代码不会硬编码为该类型(List
)。
示例:假设您稍后决定更改您的Storage
类以将数据保存在其他类型的存储中(即数据库,XML等)您可以使用Entity Framework连接到数据库,或者您的可能会使用LINQ到对象。
实际上,您可能需要考虑使用IEnumerable
或IEnumerable<string>
。这些类型与LINQ以及大多数其他类型的集合一起工作。因此,您可以转换到LINQ而不更改返回类型并重新处理处理Storage
类的所有代码。
而且,也许string
也不是最佳选择?你在收藏什么?也许你应该为你正在存储的对象创建一个类(即Name
)。然后你想要返回IEnumerable<Name>
。
class Name
{
public string Name { get; set; }
}
稍后您可能希望向您的班级添加对FirstName
和LastName
的访问权限:
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>
您不必更改任何消费代码来执行此操作 - 只要您支持Name
类的原始界面,就可以添加额外的功能而无需打破任何事情。
现在,如果您迁移到其他返回类型,您还应该考虑将处理Storage
的所有代码迁移到新类型。当您在代码中的任何位置[{1}}烘焙“存储类型”时,您将更难以进行更改。您现在可能不会欣赏这一点,但随着您成为更好的程序员或发现自己未来的更改,您将看到使用允许更改基础类型的界面的好处。当您选择对象类型并在第一个版本中容纳它们时,请尝试预测未来的可能性,并在以后添加时节省您的头痛。
答案 2 :(得分:0)
如果您问为什么要在对象上返回接口,那么接口会描述对象的作用以及如何使用它,而不是需要特定的实现。它使代码更通用。
如果你问的是为什么是Collection而不是List,那么集合并不意味着一个List而是一个List。技术术语是集合“较弱”,因此适用于更多情况。如果您不需要订购,请使用Collection。否则,请使用List。