所以我目前正在学习事件和委托(delegate),并想进行一些测试。我创建了一个名为 car 的类。我的想法是,每次我改变轮胎的值(value)时,我都想调用该事件。这一切仅用于学习目的。我收到 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,导致无限循环,最终堆栈溢出。
这个问题的解决方案是私有(private)支持字段。您声明一个与存储值的公共(public)属性类型相同的私有(private)变量。在实现自定义 getter 和 setter 时,您可以使用私有(private)字段。
这个有效:
private int _tireValue;
public int TireValue
{
get => _tireValue;
set
{
_tireValue = value;
OnTireChanged?.Invoke(this, EventArgs.Empty);
}
}
你可以阅读另一个解释on a different answer .如此处所述,您可以使用自动属性来避免私有(private)支持字段。
关于c# - StackOverflowException 在 C# 中处理事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69782401/