1

我有一个包含常量数据集合的类型。常量由在我的程序之外定义的标准定义。类型如下所示:

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

这导致CA2104:DoNotDeclareReadOnlyMutableReferenceTypes来自 FxCop 的数千次检测。此检测中的注释表明,如果指示的类型是不可变的,则应该抑制检测,在这种情况下就是这样。但是,如果我可以避免这样做,我不希望有成千上万的压制。

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

4

1 回答 1

2

请参阅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它是不可变的。如果将其更改为可变类型(likeList或 an Array),则引用将是只读的,但内容可以修改,从而使类本身可变。

于 2013-04-16T18:22:04.787 回答