有没有办法告诉FxCop一个类型应该是不可变的?

本文关键字:类型 一个 不可变 FxCop 有没有 | 更新日期: 2023-09-27 18:09:26

我有一个包含常量数据集合的类型。常量是由程序外定义的标准定义的。类型看起来像这样:

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。该检测中的注意事项表明,如果指定的类型是不可变的,则应该抑制检测,而在本例中正是如此。但是,如果可以避免的话,我不想有成千上万的抑制。

是否有可能将此类型标记为不可变,从而防止发生此检测?

有没有办法告诉FxCop一个类型应该是不可变的?

请参阅有关如何在MSDN上执行此操作的文章。

看起来FxCop寻找一个名为ImmutableTypes.txt的文本文件,它应该认为是"不可变的"类型。

不管它的价值是什么,你的类从内部是可变的,即使你没有显式地改变它。使其不可变的一个更改是将属性从自动实现更改为由只读字段支持的仅获取属性:

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是不可变的。如果将其更改为可变类型(如ListArray),则引用将是只读的,但内容可以修改,因此使类本身可变

相关文章: