Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的事件属性代码会导致堆栈溢出异常?_C#_Winforms_Events_Properties_User Controls - Fatal编程技术网

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

C# 为什么我的事件属性代码会导致堆栈溢出异常?,c#,winforms,events,properties,user-controls,C#,Winforms,Events,Properties,User Controls,我正在制作一个自定义按钮Winforms控件库,并具有下面的代码,以便将所有鼠标指针添加到按钮中的所有控件中。当我运行它时,它会导致堆栈溢出异常。我用Click而不是MouseEnter编写了相同的代码,它工作得很好。代码如下: public new event EventHandler MouseEnter { add { this.MouseEnter += value; foreach (Control i in Controls)

我正在制作一个自定义按钮Winforms控件库,并具有下面的代码,以便将所有鼠标指针添加到按钮中的所有控件中。当我运行它时,它会导致堆栈溢出异常。我用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;
        }
    }
}
+=是调用此事件的加法器的缩写。您正在从加法器调用+=。因此,您有未绑定的递归,导致堆栈溢出

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

如果您想创建这样做的帮助器方法,这可能更有意义,因为现在调用这些方法的使用者确切地知道他们要进入什么。同样,这将消除您的递归错误以进行引导

最后,这个功能可能是不必要的:不管怎样,许多事件都会从子事件冒泡到父事件。

+=是调用此事件的加法器的缩写。您正在从加法器调用+=。因此,您有未绑定的递归,导致堆栈溢出

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

如果您想创建这样做的帮助器方法,这可能更有意义,因为现在调用这些方法的使用者确切地知道他们要进入什么。同样,这将消除您的递归错误以进行引导


最后,这个功能可能是不必要的:不管怎样,很多事件都会从孩子到家长冒出来。

我想你想要这样的东西,不确定它是否适合私人成员:

private EventHandler 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;
    }
}
}


你有这个.MouseEnter在递归中调用自己。

我想你想要这样的东西,不确定它是否适合私有成员:

private EventHandler 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;
    }
}
}


你让这个.MouseEnter在递归中调用自己。

我最终替换了这个。用base单击。单击

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

我最终替换了此。单击“使用基本”。单击

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

我知道,但是为什么我的点击代码可以工作,除了鼠标指针被替换为点击,其他都是一样的,当这个不起作用时?是的,代码是this.MouseEnter+=值;导致将另一个eventhandler添加到MouseEnter。之所以堆栈溢出比单击更快,是因为每次鼠标移动都会导致此代码溢出called@leaf68你能粘贴点击事件的代码吗?真奇怪,真奇怪。真的不知道为什么一个可以工作而另一个不能,而且可能在没有看到更多代码的情况下不能。也许可以尝试使用调试器单步通过单击加法器来查看发生了什么。好的,不管怎样,两者都不起作用。我为Click添加了一个新事件,它有相同的例外我知道为什么我的Click代码可以工作,除了MouseEnter被替换为Click之外,它是相同的,而这个没有?是的代码this.MouseEnter+=值;导致将另一个eventhandler添加到MouseEnter。之所以堆栈溢出比单击更快,是因为每次鼠标移动都会导致此代码溢出called@leaf68你能粘贴点击事件的代码吗?真奇怪,真奇怪。真的不知道为什么一个可以工作而另一个不能,而且可能在没有看到更多代码的情况下不能。也许可以尝试使用调试器单步通过单击加法器来查看发生了什么。好的,不管怎样,两者都不起作用。我为Click添加了一个新事件,它有相同的例外只有当你只提升Click的基本版本时,它才有效;您的Click版本只不过是一个助手方法,用于将处理程序的订阅传播到控件的子级。请不要将此逻辑隐藏在事件加法器后面,只需创建一个名称明确且有注释的helper方法即可。这仅适用于只提升基本版本的Click;您的Click版本只不过是一个助手方法,用于将处理程序的订阅传播到控件的子级。请不要将此逻辑隐藏在事件加法器后面,只需创建一个明确命名和注释的helper方法。