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