构造后如何修改值类型中的只读字段

本文关键字:类型 读字段 修改 何修改 | 更新日期: 2023-09-27 18:00:03

来自C#4.0第7.5.5节。

如果M是在值类型中声明的实例函数成员:

  • […]
  • 如果E未分类为变量,则会创建E类型的临时局部变量,并将E的值分配给变量E随后被重新分类为该临时局部变量。临时变量在M、 但不能以任何其他方式。因此,只有当E是真变量时(什么是真正的变量…?)调用方是否可以观察到M对此表示赞同

Eric Lippert接着说:

这一点说明了可变性和按值复制语义可能会带来麻烦。对于例如,只读字段在构造函数运行。因此,尝试调用一个发生变异的方法值类型的只读字段的内容成功,但实际上变异副本!通过避免可变的值类型来避免这些问题总共

我怎样才能重现孙所描述的场景?我尝试了以下方法。正如我所料,它出错了:

    struct A
    {
        public readonly int mutableReadonlyField;
        public A(int originalValue)
        {
            mutableReadonlyField = originalValue;
        }
        public A MethodThatMutatesTheContentsOfAReadOnlyField(int mutate)
        {            
            this.mutableReadonlyField = mutate;//Constructor has run so mutableReadonlyField is a temporary local variable
            //ERROR: A readonly field cannot be assigned to (except in a constructor or a variable initializer)
            A newA = this;//Is this a true variable?
            return newA;
        }
}

构造后如何修改值类型中的只读字段

我在博客上举了一个例子:

http://ericlippert.com/2008/05/14/mutating-readonly-structs/

问题是,我的句子片段"一个值类型的只读字段"是模糊和误导的。我的意思是指中的只读字段,其中字段为值类型S,但显然更自然的解读是将其作为S本身的只读字段。我本应该把这个句子全部改写的。对这个错误深表歉意。

为了回答你的另一个问题:形容词"true"是不必要的。如果这句话只是说"因此,只有当E是一个变量时,调用者才有可能观察到M对此所做的改变