StackOverflowException 在 C# 中处理事件
StackOverflowException working with events in c#
所以我目前正在学习事件和委托,并想进行一些测试。我创建了一个名为 car 的 class。我的想法是,每次我改变轮胎的价值时,我都想调用该事件。这一切仅用于学习目的。我得到一个 WhosebugException,我不知道为什么。
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,从而导致无限循环, 以及最终的堆栈溢出。
这个问题的解决方案是私有支持字段。您声明一个与 public 属性 类型相同的私有变量,您在其中存储值。在实现您的自定义 getter 和 setter 时,您使用私有字段。
这个有效:
private int _tireValue;
public int TireValue
{
get => _tireValue;
set
{
_tireValue = value;
OnTireChanged?.Invoke(this, EventArgs.Empty);
}
}
您可以阅读另一个解释on a different answer。正如那里提到的,您可以使用自动 属性 来避免私有支持字段。
所以我目前正在学习事件和委托,并想进行一些测试。我创建了一个名为 car 的 class。我的想法是,每次我改变轮胎的价值时,我都想调用该事件。这一切仅用于学习目的。我得到一个 WhosebugException,我不知道为什么。
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,从而导致无限循环, 以及最终的堆栈溢出。
这个问题的解决方案是私有支持字段。您声明一个与 public 属性 类型相同的私有变量,您在其中存储值。在实现您的自定义 getter 和 setter 时,您使用私有字段。
这个有效:
private int _tireValue;
public int TireValue
{
get => _tireValue;
set
{
_tireValue = value;
OnTireChanged?.Invoke(this, EventArgs.Empty);
}
}
您可以阅读另一个解释on a different answer。正如那里提到的,您可以使用自动 属性 来避免私有支持字段。