You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:24:05