参加以下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);
}
}
然后测试将通过。
为什么会这样?
答案 0 :(得分:7)
就在这里:
_singWraper.SetMyValue(singleVa);
VS
SingWraper.SetMyValue(singleVa);
在第二个中,您访问属性,因此您克隆结构;基本上这与:
相同var clonedAndIndependentValue = SingWraper; // getter
clonedAndIndependentValue.SetMyValue(singleVa);
注意我们已经更新了不同的结构值;与字段访问形成对比,字段访问与现有结构值进行对话。
另一个为什么可变结构是邪恶的例子。 不要做。使结构不可变(没有Set*
方法,属性设置器或其他恶作剧)。或者使用课程。