在C#中,为什么在这种情况下使用字段与自动实现的属性会导致不同的行为?

Pan*_*sis 1 c# syntax properties

http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx获取以下代码:

using System;

struct MutableStruct
{
    public int Value { get; set; }

    public void SetValue(int newValue)
    {
        Value = newValue;
    }
}

class MutableStructHolder
{
    public MutableStruct Field;
    public MutableStruct Property { get; set; }
}

class Test
{    
    static void Main(string[] args)
    {
        MutableStructHolder holder = new MutableStructHolder();
        holder.Field.SetValue(10);
        holder.Property.SetValue(10);

        Console.WriteLine(holder.Field.Value);
        Console.WriteLine(holder.Property.Value);
    }
}
Run Code Online (Sandbox Code Playgroud)

(我之前错过的代码中有几条评论或者没有读过我现在已经删除的代码.)

在文章的要求是输出10holder.Field,但0对于holder.Property,这已被证实是准确的.虽然如此,我有点麻烦.一个自动实现的属性将有一个特定的字段被放置,它被映射到,并且由于是一个结构,Property它将立即从头开始完全设置和构造其支持字段.有什么不同?

Jon*_*len 5

该行holder.Property返回一份副本MutableStruct.所以当你写作时holder.Property.SetValue(10)你正在改变副本,而不是原始副本.

该行holder.Field是其MutableStruct自身的别名.

很难不偶然地复制结构.因此,我们试图不让它们变得可变.