【问题标题】:Which declaration is best to use, Collection or IEnumerable? [duplicate]哪个声明最好使用,Collection 还是 IEnumerable? [复制]
【发布时间】:2012-04-09 11:12:25
【问题描述】:

我可以用两种方式编写代码来实现我的目标,但想知道哪一种是最好的做法?

Collection<MyClass> obj = new Collection<MyClass>();

IEnumerable<MyClass> obj = new Collection<MyClass>();

【问题讨论】:

  • 这是一个略有不同的问题,但却是一个相关的答案。 stackoverflow.com/questions/376708/…
  • 还有 IList 和 ICollection 需要考虑! IEnumerable 可能是最灵活的,但有忘记它是延迟执行的风险,如果你不小心,可能会导致一些有趣的错误!重申一下 IList 和 ICollection 是安全的,IEnumerable 不是(导致重新生成集合,例如,如果从 DB 中生成,这会很昂贵),但如果只使用一次,它的性能很好/速度很快。

标签: c# c#-4.0 c#-3.0


【解决方案1】:

在这种情况下,IEnumerable&lt;MyClass&gt; obj = new Collection&lt;MyClass&gt;() 毫无意义,因为您有一个无法添加项目的空集合(因为IEnumerable 不允许这样做)。这有什么用?

除此之外,如果我们谈论的是不会暴露给方法之外的代码的局部变量,那么唯一重要的是方便和清晰。您可以使用第一种形式的等效项来最大化这两种形式:

var obj = new Collection<MyClass>();

如果对象 暴露给外部代码(例如,通过属性,或者如果它由方法返回),那么您应该选择最适合您的类的公共接口的类型.这意味着,根据经验,您应该尽可能使用最不专业的类型,并且总是更喜欢接口

因此,如果您要公开obj,并且该集合不打算由您的代码的用户修改,则应该使用IEnumerable。否则,如果可以,您应该使用ICollection;如果还不够,那就IList

【讨论】:

  • 我想记住“我们应该尽可能使用最少专业化的类型,并且总是更喜欢接口。”
【解决方案2】:

个人比较喜欢

var obj = new Collection<MyClass>();

这甚至可以成功编译到带有 VS.NET 2008 及更高版本的 .NET 2.0。

documentation for var

【讨论】:

  • 这只是第一个选项的不同表示法。不是真正的答案。
【解决方案3】:

我个人认为这取决于您想要达到的特异性水平。

请记住 Collection&lt;T&gt; 暗示 IList&lt;T&gt;, ICollection&lt;T&gt;, IEnumerable&lt;T&gt;, IList, ICollection, IEnumerable

正如 Jon 已经指出的那样,您给出的示例没有任何意义,因为您正在创建一个无法添加到的空集合,但给出了一个不同的示例,具体程度就会发挥作用。

集合有一组特定的成员,如果需要这些成员,请使用它。如果您想对集合中的数据不那么具体,您可以强制转换为 Collectioin 实现的任何接口。问题是,如果您要创建 Collection&lt;T&gt;,为什么要这样做。

【讨论】:

    【解决方案4】:

    这完全取决于要求。 如果处理 DAL 或返回数据库对象,则 IEnumerable 更可取。

    声明为 Collection 将提供更多功能。 You can get more idea on there.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 2012-07-27
      • 2014-04-12
      • 2012-08-25
      • 2011-04-07
      • 2011-03-30
      相关资源
      最近更新 更多