属性总是不变的吗?

时间:2019-01-16 11:03:16

标签: c# properties

在为类成员使用自动生成的属性时,我目前遇到问题。在类上调用方法应该会更新属性,但似乎不起作用。

我正在更新一些旧的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#中的错误?

1 个答案:

答案 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的值,因为您是直接在变量上调用它的。属性不是这种情况-使用属性获取器实际上是在调用返回值的方法,该值是变量值的副本。

如果您要使用类,则会看到预期的行为,因为那样您就不会尝试更改基础变量的值,而是会更改其引用的对象中的内容。