我目前在為類成員使用自動生成的屬性時遇到問題。在類上調(diào)用方法應(yīng)該更新屬性,但它似乎不起作用。我正在更新一些舊的 C# 代碼,VS2017 建議我提供一些重構(gòu)技巧,例如,將具有手動提供的屬性的私有成員轉(zhuǎn)換為自動生成的屬性。VS 只需單擊幾下就可以輕松完成,一切都編譯得很好。問題是代碼不像以前那樣工作??紤]以下簡化的代碼示例:using System;public class Program { struct A { public A(int x) : this() { X = x; } public int X { get; private set; } public void Update(int y) { X += y; } } class B { private A _secondVar; public B() { } public A MyVar { get; set; } public A SecondVar { get { return _secondVar; } protected set { _secondVar = value; } } public void Foo(int z) { MyVar.Update(z); _secondVar.Update(z); } } public static void Main() { B b = new B(); Console.WriteLine("BEFORE: b.MyVar: " + b.MyVar.X + ", b.SecondVar: " + b.SecondVar.X ); b.Foo(23); Console.WriteLine("AFTER: b.MyVar: " + b.MyVar.X + ", b.SecondVar: " + b.SecondVar.X ); }}輸出是:BEFORE: b.MyVar: 0, b.SecondVar: 0AFTER: b.MyVar: 0, b.SecondVar: 23我希望調(diào)用MyVar.Update(z)會更新屬性,并且后續(xù)調(diào)用MyVar.X應(yīng)該提供更新的值。這是預(yù)期的行為,還是 C# 中的錯誤?
1 回答

元芳怎么了
TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個贊
您正在使用可變結(jié)構(gòu),正是出于這個原因,強(qiáng)烈建議您不要這樣做。
你的代碼在這里:
public void Foo(int z)
{
MyVar.Update(z);
_secondVar.Update(z);
}
相當(dāng)于:
public void Foo(int z)
{
A tmp = MyVar; // Creates a copy
tmp.Update(z);
_secondVar.Update(z);
}
您的_secondVar.Update(z)代碼更改了 的值,_secondVar因?yàn)槟苯釉谧兞可险{(diào)用它。您的屬性并非如此 - 使用屬性獲取器實(shí)際上是調(diào)用一個返回值的方法,該值是變量值的副本。
如果您要使用類,您會看到您期望的行為,因?yàn)檫@樣您就不會嘗試更改底層變量的值,而是更改它所引用的對象中的內(nèi)容。
- 1 回答
- 0 關(guān)注
- 112 瀏覽
添加回答
舉報(bào)
0/150
提交
取消