C# 为什么使用ICollection<;T>;而不是列表<;T>;如果我使用ICollection<;T>;,那么如何使用AddRange、Insert和其他列表方法呢

C# 为什么使用ICollection<;T>;而不是列表<;T>;如果我使用ICollection<;T>;,那么如何使用AddRange、Insert和其他列表方法呢,c#,.net,generics,collections,fxcop,C#,.net,Generics,Collections,Fxcop,我正在使用FxCop工具进行代码分析,它显示了一个关键错误,如“不要公开泛型列表”,并建议尝试使用ICollection而不是使用列表对象 我试图用ICollection替换列表,但是我有很多插入和添加范围方法的地方,我无论如何都需要它们来实现我的业务逻辑 “那么我如何在Icollection上使用Insert、AddRange和其他列表方法而无需类型转换或使用ToList()方法,因为如果我必须使用这些方法,那么为什么我应该用Icollection替换列表” 如果您不明白我的问题是什么,请不要

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

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

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


如果您不明白我的问题是什么,请不要将任何内容标记为重复。

公开列表不是一个好做法,因为您可以使用Add等方法修改原始集合,最好公开IEnumerable。此接口不允许更改集合,我的优势是,你将在一个地方管理你的收藏保持逻辑性

还有
IList
请查看此帖子,你能激发你为什么认为这不是另一个问题的重复吗?接口继承
ICollection
并声明
添加
插入
删除
方法和类似方法
AddRange
不包括在
IList
中,但在这些情况下,您可能可以执行显式强制转换?或者,您可以实现
AddRange(此IList目标,IEnumerable源)
扩展方法来隐藏强制转换。
ICollection
IList
可以保证内存中存在实际的集合。
IEnumerable
也可能是数据库游标或文件的包装器,因此迭代非常缓慢或不稳定。我同意你的观点,公开
IEnumerable
通常是优雅的,但并不总是最好的选择。有些语言具有内置的不可变集合,也有一些可用于C#。“公开列表不是一个好的做法,因为您可以修改原始集合”:这不是FxCop建议不公开
List
的原因:FxCop接受通常的替代方法
IList
,如果基础具体集合是可变的(
IsReadOnly
false),则还允许您修改集合。因此,返回
IEnumerable
并不能防止强制转换和修改可变的基础集合。如果要返回不可变集合,可以返回
ReadOnlyCollection
或类似内容,强制转换为
IList
IEnumerable
ICollection