在事件处理程序周围传递EventArg是否有潜在危险?

时间:2012-04-12 16:38:39

标签: c# winforms listview event-handling contextmenustrip

我正在调用另一个事件处理程序:

private void launchApplicationToolStripMenuItem_Click(object sender, EventArgs e) {
            listApplications_DoubleClick(listApplications, null); 
        }

        private void listApplications_DoubleClick(object sender, EventArgs e) {

“listApplications”是一个ListView。

我必须传递listApplications,因为我将DoubleClick()事件中的发件人转换为ListView。

但第二个arg怎么样?如上所示,我应该传递null,还是应该像这样传递“e”:

listApplications_DoubleClick(listApplications, e);

在良好的环境下,这两种方式都可以正常/完全相同。我不知道是否会出现异常情况,但是......

3 个答案:

答案 0 :(得分:1)

当您调用相同事件的事件处理程序时(即,当您从另一个双击事件调用doubleclick事件时),您应该将事件参数传递给它。事件参数包含有关双击的重要信息,例如,其位置。如果处理程序“在链中”不关心这些参数,则传递null不会导致问题;但是,您不应该假设您正在调用的处理程序忽略该参数,并将有效的内容传递给它。

以下是an example如何使用事件参数来计算双击的位置。

答案 1 :(得分:1)

不,传递EventArg并不危险 除非你没有使用ein方法listApplications_DoubleClick(对象发送者,EventArgs e)正文..发送null是好的,

答案 2 :(得分:1)

好吧,我不会说危险,但它可能会导致一些问题,例如如果处理不当则会出现异常。在您的示例中,一个事件是单击事件,另一个是双击事件,这意味着EventArgs对象e实际上都是MouseEventArgs。哪个好,因此你不必担心第二个事件处理程序访问e。

的不存在的成员

现在假设您想在用户点击某个按钮时调用paint事件。在这种情况下,click事件将调用paint事件。现在问题是:paint事件需要一个PaintEventArgs,因此传递MouseEventArgs可能会导致异常。当然,如果您控制了两段代码,那么您可以自行检查是否可以访问PaintEventArgs特定成员。如果没有,那么你很好,虽然我没有看到在这种情况下传递args的意义。

希望不要太困惑。