CA2104警告:有没有办法将类标记为“不可变”来抑制它?

请考虑以下代码,它引发CA2104: Do not declare read only mutable reference types.

 public class Test { // This provokes CA2104: "Do not declare read only mutable reference types". protected readonly ImmutableClass ImmutableMember; } public class ImmutableClass { } 

有没有人知道一种方法将类标记为不可变的方式会抑制警告CA2104?

我尝试使用[ImmutableObject(true)]装饰MutableClass而没有成功的希望(因为该属性对于表单编辑器来说非常清楚),并且肯定它不起作用。

我假设Code Analysis在确定是否发出CA2104时使用已知的不可变类型列表,因此我们不能使用相同的方法。

我想即使你可以将一个类标记为不可变,编译器也无法实际检查它是否为真,但至少它可能是一个有用的指标。

无论如何,我有什么属性可以忽略吗? 如果没有,就必须进行压制。

目前似乎没有替代方法可以做到这一点

我找到了一个有趣的博客,来自Joe Duffy(“Windows上的并发编程”一书的作者)关于这种事情 。

他从“想象我们有一个不可变的属性”开始 …… 🙂

这很有意思 – 他遇到了编写一些新的FxCop规则来分析属于不可变的类型的麻烦。

protected readonly字段并不是那么清楚。 作为protected ,您可能希望派生类可以初始化该字段:

 public class Test { protected readonly ImmutableClass ImmutableMember; } public class SpecialTest : Test { public SpecialTest() { ImmutableMember = new ImmutableClass; } } 

但是,情况并非如此 – 您将收到编译错误(CS0191)。

我不知道CA2104背后的确切推动力,但是你可以在没有readonly的情况下得到相同的结果:

 public class Test { protected ImmutableClass ImmutableMember {get; private set;} public Test() :this(new ImmutableClasse()) { } public Test(ImmutableClass immutableClass) { ImmutableMember = new ImmutableClasse(); } } 

并避免使用CA2104。

更新:

wrt to the comments(以及未来的读者),正如您所说,您可以使用支持字段来获取只读并提供受保护的getter以在派生类中获取它:

 public class Test { private readonly ImmutableClass immutableMember; protected ImmutableClass ImmutableMember { get { return immutableMember; } } public Test(ImmutableClass immutableMember) { this.immutableMember = immutableMember; } }