【问题标题】:Collection vs ICollection集合与 ICollection
【发布时间】:2010-10-21 11:31:52
【问题描述】:
我创建了一个用于测试集合和 ICollection 的虚拟项目。我有一个用户类并想创建一个集合。示例 -
ICollection<User> users = new Collection<User>();
Collection<User> users = new Collection<User>();
无论我使用 Collection 还是 I collection,这两个代码都可以正常工作。现在谁能告诉我上面两行的区别是什么?
提前致谢。
【问题讨论】:
标签:
asp.net
collections
icollection
【解决方案1】:
第一行ICollection<User> users = new Collection<User>(); 创建一个对实现ICollection 接口的对象(Collection)的引用,而第二行Collection<User> users = new Collection<User>(); 创建一个对一个对象的引用,该对象是Collection 类的具体实现,其中T = User。
在使用方面,您可能希望使用 ICollection 引用,您的后续代码需要不知道它正在处理的集合类型,即您可以提供任何实现 ICollection 的对象并且您的代码仍然可以工作。如果您的代码没有紧密耦合(当然我们都想要),那就太好了。
使用 Collection 作为引用将您的处理代码与 Collection 类紧密耦合,这是 ICollection 的特定实现,虽然您可能仍然只使用接口中定义的方法,但您也可能使用该类的一些特定功能,然后您就赢了'不能轻易地用不同的东西替换集合对象。这有很好的理由,但它有点超出了这里的答案范围,在这里搜索依赖注入和控制反转,我相信你会找到大量的背景信息。
【解决方案2】:
Collection<T> 只是ICollection<T> 的一个实现。如果有人创建了另一个从 ICollection<T> 实现的类,您可以通过将第一行替换为以下内容来轻松使用该类:
ICollection<User> users = new MyCustomCollectionCollection<User>();
稍后在代码中,您无需修复任何内容,因为仍然使用相同的接口。
【解决方案3】:
ICollection 是一个接口。 Collection 实现了 ICollection,所以它可以工作。 ICollection 不是一个类,所以这不起作用:
ICollection<User> users = new ICollection<User>();
..因为你不能实例化一个接口。接口只是描述类必须实现的内容。
【解决方案4】:
因为users 是参考。在两个样本中,它都指向同一个对象。行为由对象的类定义,并且是相同的。