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。正如那里提到的,您可以使用自动 属性 来避免私有支持字段。