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
我正在使用fxcop工具进行代码分析,它显示了一个严重的错误,比如"不要公开generice列表",它建议不要使用列表对象,而是尝试使用ICollection。
我试图用ICollection替换列表,但是有太多地方我有insert和add range方法,无论如何我需要它们来实现我的业务逻辑。
"因此,我如何在ICollection上使用insert、addrange和其他列表方法而不进行类型转换或使用to list()方法,因为如果我必须使用这些方法,那么我为什么要用ICollection替换列表?"
如果你不理解我的问题,请不要在任何重复的地方做标记。
- 还有EDOCX1[0]
- 请查看此post stackoverflow.com/questions/271710/&hellip;
- 你能激发为什么你相信这不是另一个问题的复制品吗?
- ilist接口继承ICollection并声明Add、Insert和Remove方法及类似方法。AddRange不包括在IList中,但在这些情况下,您可能可以进行明确的铸造?或者,您可以实现一个AddRange(this IList destination, IEnumerable source)扩展方法来隐藏转换。
公开列表不是一个好的实践,因为您可以使用诸如add之类的方法修改原始集合,更好地公开IEnumerable。此接口不允许更改集合,我的优势在于,您可以将逻辑与管理集合保持在一个位置。
- ICollection和IList虽然在内存中有一个实际的集合,但它们确实可以保证。IEnumerable也可能是数据库光标或文件的包装器,因此迭代非常缓慢或不稳定。我同意你的看法,曝光IEnumerable通常很优雅,但并不总是最佳选择。有些语言具有内置的不可变集合,有些语言也可用于C。blogs.msdn.com/b/bclteam/archive/2012/12/18/&hellip;
- "公开列表不是一个好的做法,因为您可以修改原始集合":这不是fxcop建议不公开List的原因:fxcop接受了通常的替代IList,如果基础具体集合是可变的(IsReadOnlyfalse),还允许您修改集合。因此,返回IEnumerable并不能防止强制转换和修改可变的基础集合。如果要返回不可变的集合,可以返回ReadOnlyCollection或类似的集合,强制转换为IList、IEnumerable或ICollection。