C# 未使用结构更新自动属性值

C# 未使用结构更新自动属性值,c#,C#,选择以下struct类: public struct SingleWraper { private double _myValue; public double MyValue { get { return _myValue; } set { _myValue = value; } } public void SetMyValue(double myValue) { _myValue = myVa

选择以下
struct
类:

public struct SingleWraper
{
    private double _myValue;

    public double MyValue
    {
        get { return _myValue; }
        set { _myValue = value; }
    }

    public void SetMyValue(double myValue)
    {
        _myValue = myValue;
    }
}

public struct DoubleWraper
{
    public SingleWraper SingWraper { get; set; }

    public void SetMyValue(double singleVa)
    {
        SingWraper.SetMyValue(singleVa);
    }
}
运行以下测试:

    [Test]
    public void SetMyValue()
    {
        var singleWraper = new DoubleWraper();
        singleWraper.SetMyValue(10);
        Assert.AreEqual(10,singleWraper.SingWraper.MyValue);
    }
它失败了

但是,如果没有为
DoubleWraper
使用automatic属性,即,将字段展开如下:

public struct DoubleWraper
{
    private SingleWraper _singWraper;
    public SingleWraper SingWraper
    {
        get { return _singWraper; }
        set { _singWraper = value; }
    }

    public void SetMyValue(double singleVa)
    {
        _singWraper.SetMyValue(singleVa);
    }
}
然后考试就通过了

为什么会这样?

这里是:

_singWraper.SetMyValue(singleVa);
vs:

在第二种情况下,访问属性,因此克隆结构;本质上,这与:

var clonedAndIndependentValue = SingWraper; // getter
clonedAndIndependentValue.SetMyValue(singleVa);
注意,我们更新了一个不同的结构值;与字段访问相反,字段访问与现有的
结构值对话


另一个说明易变结构为何邪恶的例子不要这样做。使结构不可变(无
Set*
方法、属性设置器或其他诡计)。或者使用一个类。

这很可能是我在一段时间内看到的关于可变结构危险的最清楚的例子之一。这是一个常见问题。以下是本周早些时候的答案:
var clonedAndIndependentValue = SingWraper; // getter
clonedAndIndependentValue.SetMyValue(singleVa);