可能重复:
是什么(的T)名单,并集(的T)之间的区别?
我有一个静态类和一个getter返回我的收藏列表。 现在我读和已被告知返回ICollection的,而不是名单。 什么是使用公共静态的ICollection对公共静态列表的优势在哪里?
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);
}
}
}
}
-
IEnumerable<T>
提供了对访问只向前光标放在一系列T
对象 -
ICollection<T>
提供相同IEnumerable<T>
而且一个Count
属性(意味着集合具有最终结束) -
IList<T>
提供相同ICollection<T>
也通过一个索引随机访问到列表内的任何元素( list[5]
List<T>
实现了所有上面的。
使用简单的界面作为一个参数或返回值的好处是,它提供了更多的灵活性,给调用者,可以帮助记录如何对象将被用于(或打算在返回值的情况下使用)。
这是很好的做法,更容易维护。 如果您使用的接口,而不是一个类型的,然后你的代码是不是硬编码到该类型( List
)。
示例:假设您稍后决定更改Storage
类坚持另一种类型的存储(即数据库,XML等),则可以使用实体框架连接到数据库,或者您可以使用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
,以及为新的类型。 当您在代码中无处不在“烤在”存储类型List
你变得更困难,使未来的变化。 现在,您可能不希望这一权利,但你成为一个更好的程序员或者发现自己进行未来的变化,你会看到使用允许改变基本类型的接口的好处。 尝试当您选择的对象类型,并适应他们在第一次修改,你会节省头痛,当你以后添加的东西来预测未来的可能性。
如果你问为什么在返回对象的接口,该接口描述了对象呢,它是如何使用的,而不是要求一个具体的实现。 这使得代码更通用。
如果你问为什么一个集合,而不是一个列表,收藏不要,而列表确实意味着一个数量级。 该技术术语是集合是“弱”等适用于更多的情况。 如果不需要排序,使用的集合。 否则,使用列表。