ReadOnlyCollection <char>是不可变的吗?</char>

时间:2010-04-21 07:21:41

标签: c# visual-studio

使用下面的代码我得到CA2104 (DoNotDeclareReadOnlyMutableReferenceTypes) warning

public readonly ReadOnlyCollection<char> IllegalChars;

部分错误消息

  

将字段更改为一个字段   不可变引用类型。如果   参考类型   'ReadOnlyCollection'是,in   事实上,不可变,排除了这条消息。

我确信ReadOnlyCollection是不可变的但我的问题是我可以使用哪种类型没有出现此消息?

2 个答案:

答案 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的精神,因为您可以免除它旨在拯救您的那些问题。那么抑制警告是合理的。

除非我确定我想要一个领域,否则我会更加谨慎地对待公共领域,偏爱属性,但这是另一回事。