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; } }