gpt4 book ai didi

c# - 自动属性值未随结构更新

转载 作者:行者123 更新时间:2023-11-30 14:19:52 24 4
gpt4 key购买 nike

采用以下 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 使用自动属性,即,您按如下方式扩展该字段:

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

对比:

SingWraper.SetMyValue(singleVa);

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

var clonedAndIndependentValue = SingWraper; // getter
clonedAndIndependentValue.SetMyValue(singleVa);

注意我们已经更新了一个不同的结构值;与字段访问形成对比,字段访问与现有结构值对话。

又一个为什么可变结构是邪恶的例子。 不要这样做。使结构不可变(没有 Set* 方法、属性 setter 或其他恶作剧)。或者使用类。

关于c# - 自动属性值未随结构更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2154464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com