只读改变结构的行为

时间:2014-11-03 19:26:59

标签: c# immutability readonly

我试图了解一些基本概念:

class Program
{
   private static readonly MyStruct m = new MyStruct();
   static void Main(string[] args)
    {
       //new MutableSample().RunSample();

       Console.WriteLine(m.ChangeInternal());
       Console.WriteLine(m.ChangeInternal());
       Console.WriteLine(m.ChangeInternal());
       Console.Read();
    }
}

public struct MyStruct
{
    private int x;
    public int ChangeInternal()
    {
        this.x = this.x + 1;
        return this.x;
    }
}

当我运行这段代码时,它给了我1,1,1,但当我删除" readonly"它说1,2,3。

有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:5)

C#规范第7.5.4节规定:

  

[...]如果字段是只读的并且引用发生在声明字段的类的实例构造函数之外,则结果是一个值,即由引用的对象中的字段I的值ë

因此,当字段为readonly时,您正在改变副本(因为它不可能改变一个值,只能改变一个变量)。如果你没有改变字段本身。

Eric Lippert在this blog post中对此进行了更详细的描述。引用其结尾:

  

这是可变值类型为恶的另一个原因。尝试始终使值类型不可变。