gpt4 book ai didi

c# - 为什么我的事件属性代码会导致堆栈溢出异常?

转载 作者:太空宇宙 更新时间:2023-11-03 20:26:58 24 4
gpt4 key购买 nike

我正在制作一个自定义按钮(Winforms 控件库)并具有以下代码,以便将所有 mouseenter 添加到我按钮中的所有控件。当我运行它时,它会导致堆栈溢出异常。我使用 Click 而不是 MouseEnter 使用相同的代码,并且工作正常。这是代码:

public new event EventHandler MouseEnter {
add
{
this.MouseEnter += value;
foreach (Control i in Controls)
{
i.MouseEnter += value;
}
}
remove
{
this.MouseEnter -= value;
foreach (Control i in Controls)
{
i.MouseEnter -= value;
}
}
}

点击代码如下:

public new event EventHandler Click {
add {
this.Click += value;
foreach (Control i in Controls) {
i.Click += value;
}
}
remove {
this.Click -= value;
foreach (Control i in Controls) {
i.Click -= value;
}
}
}

最佳答案

+= 是“为此事件调用加法器”的简写。您正在从加法器调用 += 。因此你有未绑定(bind)的递归,导致堆栈溢出。

查看您的代码,您似乎正在自己定义加法器,以便不仅从控件而且从其所有子项添加和删除处理程序。这让我觉得这是一个非常糟糕的主意:给定事件的订阅者有合理的期望,他们只会在实际事件被触发时收到通知,而不是在事件被他们一无所知的任意数量的发布者触发时收到通知。

如果您想创建执行此操作的辅助方法,那可能更有意义,因为现在调用这些方法的消费者确切地知道他们正在进入什么。同样,这将消除您的递归错误。

最后,这个功能可能是不必要的:许多事件无论如何都会从 child 冒泡到 parent 。

关于c# - 为什么我的事件属性代码会导致堆栈溢出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com