所以我目前正在學習事件和委托,并想做一些測驗。我創建了一個名為 car 的類。我的想法是,每次我更改輪胎的價值時,我都想呼叫該事件。這一切僅用于學習目的。我得到一個 StackoverflowException,我不知道為什么。
private static void Main(string[] args)
{
var Car = new Car { Tire_Value = 100 };
Car.OnTireChanged = Tirestatus;
Car.Tire_Value = 10;
}
public class Car
{
public event EventHandler OnTireChanged;
public int Tire_Value
{
get
{
return this.Tire_Value;
}
set
{
this.Tire_Value = value;
this.OnTireChanged?.Invoke(this, EventArgs.Empty);
}
}
}
private static void Tirestatus(object sender, EventArgs args)
{
var car = (Car)sender;
if (car.Tire_Value < 40) Console.WriteLine("Tire is damaged");
}
uj5u.com熱心網友回復:
當您設定Tire_Value一個值時,您的 setter 會被執行,它會嘗試Tire_Value再次呼叫 setter ,從而導致無限回圈,并最終導致堆疊溢位。
此問題的解決方案是私有支持欄位。您宣告一個與公共屬性相同型別的私有變數,在其中存盤值。在實作自定義 getter 和 setter 時,您使用私有欄位。
這有效:
private int _tireValue;
public int TireValue
{
get => _tireValue;
set
{
_tireValue = value;
OnTireChanged?.Invoke(this, EventArgs.Empty);
}
}
您可以閱讀不同答案的另一個解釋。正如那里提到的,您可以使用自動屬性來避免私有支持欄位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/342851.html
