所以我目前正在学习关于事件和委托,并想做一些测试。我创建了一个名为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");
}
当您将Tire_Value
设置为一个值时,您的setter被执行,它试图再次调用Tire_Value
上的setter,导致无限循环,最终堆栈溢出。
这个问题的解决方案是私有支持域。声明一个与存储值的公共属性类型相同的私有变量。在实现自定义getter和setter时,使用private字段。
如此:
private int _tireValue;
public int TireValue
{
get => _tireValue;
set
{
_tireValue = value;
OnTireChanged?.Invoke(this, EventArgs.Empty);
}
}
你可以在另一个答案上阅读另一个解释。如前所述,您可以使用自动属性来避免私有支持字段。