我有一个包含常量数据集合的类型。常量由在我的程序之外定义的标准定义。类型如下:
public class IAmImmutable
{
public IAmImmutable(string member1, string member2)
{
this.Member1 = member1;
this.Member2 = member2;
}
public string Member1 { get; private set; }
public string Member2 { get; private set; }
public static readonly Instance1 = new IAmImmutable("abc", "def");
public static readonly Instance2 = new IAmImmutable("example", "data");
public static readonly Instance3 = new IAmImmutable("for", "stackoverflow");
public static readonly Instance4 = new IAmImmutable("these are", "constant fields");
public static readonly Instance5 = new IAmImmutable("42", "1729");
/* ... */
public static readonly Instance1000 = new IAmImmutable("HUNGRY EVIL", "ZOMBIES");
}
这会导致FxCop发现数千CA2104:DoNotDeclareReadOnlyMutableReferenceTypes
次。该检测中的注释表明,如果指示的类型是不可变的,则应该抑制检测,在这种情况下。但是,如果我能避免这样做,我不希望成千上万的压抑。
是否可以将此类型标记为不可变,从而阻止此检测发生?
答案 0 :(得分:2)
请参阅文章,了解如何在MSDN上执行此操作。
看起来FxCop正在寻找一个名为ImmutableTypes.txt
的文本文件,用于它应该被认为是“不可变”的类型。
对于它的价值,即使你没有明确地改变它,你的类也可以从内部变异。 使其不可变的一个变化是将属性从自动实现更改为仅由readonly字段支持的get属性:
public IAmImmutable(string member1, string member2)
{
this._Member1 = member1;
this._Member2 = member2;
}
private readonly string _Member1;
private readonly string _Member2;
public string Member1 { get {return _Member1;} }
public string Member2 { get {return _Member2;} }
(FxCop是否将此视为“不可变”类是另一个问题)
请注意,此仅有效,因为string
是不可变的。如果它已更改为可变类型(如List
或Array
),则引用将只读,但内容可以修改因此,使班级本身变得可变。