使用下面的代码我得到CA2104 (DoNotDeclareReadOnlyMutableReferenceTypes) warning
public readonly ReadOnlyCollection<char> IllegalChars;
部分错误消息
将字段更改为一个字段 不可变引用类型。如果 参考类型 'ReadOnlyCollection'是,in 事实上,不可变,排除了这条消息。
我确信ReadOnlyCollection是不可变的但我的问题是我可以使用哪种类型没有出现此消息?
答案 0 :(得分:4)
您可以将公共字段重写为属性:
public ReadOnlyCollection<char> IllegalChars { get; private set; }
或排除代码分析警告,因为无法更改集合。问题是FxCop无法检测到ReadOnlyCollection<T>
实际上是不可变的。
答案 1 :(得分:2)
我确信ReadOnlyCollection是不可变的。
它是不可变的,因为你无法改变它包装的集合,或通过它更改该集合。
因为ReadOnlyCollection
是一个包装器,所以它不是不可变的,它可以通过改变底层集合来改变它:
var list = new List<char>{ 'a', 'b', 'c' };
var ro = new ReadOnlyCollection<char>(list);
list.Add('d');
Console.WriteLine(string.Join(",", ro)); // a,b,c,d
但是,你当然可以拥有一个在实践中不可变的ReadOnlyCollection
,因为没有在任何地方引用底层集合(最简单的方法是在构造时复制它,或者只在第一次构建时构造该集合) readonly包装器,然后没有另一个参考)。
这样做意味着您将遵循CA2104的精神,因为您可以免除它旨在拯救您的那些问题。那么抑制警告是合理的。
除非我确定我想要一个领域,否则我会更加谨慎地对待公共领域,偏爱属性,但这是另一回事。