c# - StackOverflowException 在 C# 中处理事件

标签 c# events

所以我目前正在学习事件和委托(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/

相关文章:

c# - 使用 XmlWriter 附加到 XML 文件

c# - 更改所有 Windows Forms 窗体上的设置

c# - 从我的 WPF 应用程序和 C# 库跟踪内存中的敏感数据

mysql - 我创建了 MySQL 事件来每天触发 sp,但我的事件调用 sp 的时间间隔为一天。有没有办法解决这个问题?

Java 访问桥 C# : Only MouseClicked event firing?

java - 在android中将事件添加到用户创建的日历后,事件标题不显示

javascript - Firefox 缺少 window.event 的解决方法?

asp.net - 如何动态创建一个asp按钮并向其添加事件

c# - 使用 ExitWindowsEx 时,注销有效,但关机和重新启动无效

c# - 在 NetSuite SuiteTalk Web 服务中将 SalesOrderItem 添加到 SalesOrder