0

我创建了一个用于测试集合和 ICollection 的虚拟项目。我有一个用户类并想创建一个集合。示例 -

ICollection<User> users = new Collection<User>();
Collection<User> users = new Collection<User>();

无论我使用 Collection 还是 I collection,这两个代码都可以正常工作。现在谁能告诉我上面两行之间有什么区别?

提前致谢。

4

4 回答 4

3

第一行ICollection<User> users = new Collection<User>();创建对实现 ICollection 接口的对象 (Collection) 的引用,而第二行Collection<User> users = new Collection<User>();创建对作为 Collection 类的具体实现的对象的引用,其中 T = User。

在使用方面,您可能希望使用 ICollection 参考,您的后续代码需要不知道它正在处理的集合类型,即您可以提供任何实现 ICollection 的对象并且您的代码仍然可以工作。如果您的代码不是紧密耦合的(当然我们都想要),那就太好了。

使用 Collection 作为引用将您的处理代码紧密耦合到 Collection 类,ICollection 的特定实现,虽然您可能仍然只使用接口中定义的方法,但您也可能使用该类的某些特定功能,然后您将不会能够轻松地用不同的东西替换集合对象。这有充分的理由,但它有点超出了这里的答案范围,在这里搜索依赖注入和控制反转,我相信你会找到大量的背景信息。

于 2010-10-21T11:47:05.757 回答
2

ICollection 是一个接口。Collection 实现了 ICollection,所以它可以工作。ICollection 不是一个类,所以这不起作用:

ICollection<User> users = new ICollection<User>();

..因为你不能实例化一个接口。接口只是描述类必须实现的内容。

于 2010-10-21T11:35:59.330 回答
2

Collection<T>只是一个实现ICollection<T>。如果有人创建了另一个实现 from 的类ICollection<T>,您可以通过将第一行替换为以下内容来轻松使用该类:

ICollection<User> users = new MyCustomCollectionCollection<User>();

稍后在代码中,您不必修复任何内容,因为仍然使用相同的接口。

于 2010-10-21T11:36:22.683 回答
0

因为users是参考。在两个样本中,它都指向同一个对象。行为由对象的类定义,并且是相同的。

于 2010-10-21T11:36:04.383 回答