在为类成员使用自动生成的属性时,我目前遇到问题。在类上调用方法应该会更新属性,但似乎不起作用。
我正在更新一些旧的C#代码,而VS2017建议我一些重构技巧,例如,将手动提供的属性提供给自动生成的属性的私有成员。
只需单击几下,VS即可轻松实现,并且一切都编译正常。 问题在于代码无法像以前一样工作。
请考虑以下简化的代码示例:
BEFORE: b.MyVar: 0, b.SecondVar: 0
AFTER: b.MyVar: 0, b.SecondVar: 23
输出为:
MyVar.Update(z)
我希望调用MyVar.X
将更新属性,而随后对let vc = storyboard?.instantiateViewController(withIdentifier: screenId)
navigationController?.pushViewController(vc!, animated: true)
的调用应提供更新后的值。
这是预期的行为,还是C#中的错误?
答案 0 :(得分:10)
您正在使用可变结构,正是出于这个原因,强烈建议不要使用这种结构。
您的代码在这里:
public void Foo(int z)
{
MyVar.Update(z);
_secondVar.Update(z);
}
等效于此:
public void Foo(int z)
{
A tmp = MyVar; // Creates a copy
tmp.Update(z);
_secondVar.Update(z);
}
您的_secondVar.Update(z)
代码更改了_secondVar
的值,因为您是直接在变量上调用它的。属性不是这种情况-使用属性获取器实际上是在调用返回值的方法,该值是变量值的副本。
如果您要使用类,则会看到预期的行为,因为那样您就不会尝试更改基础变量的值,而是会更改其引用的对象中的内容。