【问题标题】: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&lt;User&gt; users = new Collection&lt;User&gt;(); 创建一个对实现ICollection 接口的对象(Collection)的引用,而第二行Collection&lt;User&gt; users = new Collection&lt;User&gt;(); 创建一个对一个对象的引用,该对象是Collection 类的具体实现,其中T = User。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-05
            • 1970-01-01
            • 2012-10-20
            • 2014-01-06
            • 1970-01-01
            • 2011-07-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多