【问题标题】:Why to use ICollection<T> instead of List<T> and if i use ICollection<T>, then how can i use AddRange,Insert and other list methods [duplicate]为什么使用 ICollection<T> 而不是 List<T>,如果我使用 ICollection<T>,那么如何使用 AddRange、Insert 和其他列表方法 [重复]
【发布时间】:2013-05-19 16:39:39
【问题描述】:

我正在使用 FxCop 工具进行代码分析,它显示了一个严重错误,例如“不要公开泛型列表”,它建议不要使用列表对象,而是尝试使用 ICollection。

我试图用 ICollection 替换 List,但是我有很多地方插入和添加范围方法,无论如何我都需要它们来实现我的业务逻辑

“那么我如何在 Icollection 上使用 Insert、AddRange 和其他列表方法而不使用类型转换或使用 ToList() 方法,因为如果我必须使用这些方法,那么为什么我应该用 ICollection 替换列表”

如果您不了解我的问题,请不要标记任何重复的内容。

【问题讨论】:

  • 还有IList
  • 你能说明为什么你认为这不是另一个问题的重复吗?
  • IList<T> 接口继承了ICollection&lt;T&gt; 并声明了AddInsertRemove 方法和类似的方法。 AddRange 不包含在 IList&lt;T&gt; 中,但是对于这些情况,您也许可以进行显式转换?或者,您可以实现 AddRange(this IList&lt;T&gt; destination, IEnumerable&lt;T&gt; source) 扩展方法来隐藏强制转换。

标签: c# .net generics collections fxcop


【解决方案1】:

公开 List 不是一个好习惯,因为您可以使用 Add 等方法修改原始集合,最好公开 IEnumerable 此接口不允许更改集合,我的优点是您将保持逻辑与管理您的集合合二为一地点

【讨论】:

  • ICollection&lt;T&gt;IList&lt;T&gt; 保证虽然内存中有一个实际的集合。 IEnumerable&lt;T&gt; 也可能是数据库游标或文件的包装器,因此迭代速度非常慢或不稳定。我同意你的观点,公开IEnumerable&lt;T&gt; 通常很优雅,但不是总是恕我直言的最佳选择。一些语言具有内置的不可变集合,还有一些可用于 C#。 blogs.msdn.com/b/bclteam/archive/2012/12/18/…
  • “公开列表不是一个好习惯,因为您可以修改原始集合”:这不是 FxCop 建议不要公开 List&lt;T&gt; 的原因:通常的替代方案 IList&lt;T&gt; 被 FxCop 接受并且如果底层的具体集合是可变的(IsReadOnly false),还允许您修改集合。就此而言,返回 IEnumerable&lt;T&gt; 并不能防止强制转换和修改可变的底层集合。如果你想返回一个不可变的集合,你可以返回ReadOnlyCollection&lt;T&gt;或类似的,转换为IList&lt;T&gt;IEnumerable&lt;T&gt;ICollection&lt;T&gt;
猜你喜欢
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多