C#使用事件实现属性变更通知时触发StackOverflowException问题
问题根因
你遇到的StackOverflowException是Tire_Value属性自递归调用导致的:
- 属性
Tire_Value的get访问器里直接return this.Tire_Value,会再次触发get访问器,形成无限递归 - 同理set访问器里
this.Tire_Value = value会再次触发set访问器,死循环最终撑爆调用栈
修复方法
C#的属性本身不存储实际值,你需要额外声明一个私有字段作为属性的实际存储载体,修改属性逻辑读写这个私有字段即可,修复后的完整代码如下:
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; // 新增私有字段存储属性实际值 private int _tireValue; public int Tire_Value { get { // 返回私有字段,避免递归调用属性 return _tireValue; } set { // 赋值给私有字段,避免递归调用属性 _tireValue = 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"); }
补充说明:如果不需要在属性的get/set中添加额外逻辑,可以直接用自动属性写法public int Tire_Value { get; set; },但你当前需求需要在赋值后触发事件,必须手动写带私有存储字段的完整属性声明。
内容的提问来源于stack exchange,提问作者Mephobia
相关产品推荐
相关产品推荐

