16

我是 C# 新手。我只是想知道多次附加事件处理程序是否会导致意外结果?

实际上在我的应用程序中,我将一个事件处理程序附加到一个像

cr.ListControlPart.Grid.CurrentCellActivated += new EventHandler(Grid_CurrentCellActivated); 

并且这行代码在代码中被多次调用。

4

3 回答 3

29

自己试试:

static class Program
{
    static event EventHandler MyEvent;

    static void Main()
    {
        // registering event
        MyEvent += Program_MyEvent;
        MyEvent += Program_MyEvent;
        MyEvent += Program_MyEvent;
        MyEvent += Program_MyEvent;
        MyEvent += Program_MyEvent;

        // invoke event
        MyEvent(null, EventArgs.Empty);
        Console.ReadKey();
    }

    static void Program_MyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("MyEvent fired");
    }
}

输出:

MyEvent fired
MyEvent fired
MyEvent fired
MyEvent fired
MyEvent fired
于 2013-10-11T09:48:59.787 回答
17

您可以通过在添加之前取消订阅来防止它,

Object.Event -= EventHandler(method);
Object.Event += EventHandler(method);

如果可以做到,请通过始终在一个地方订阅事件来防止它,比如构造函数

于 2013-10-11T09:50:48.860 回答
11

如果您继续附加事件处理程序,那么每次附加处理程序时都会引发一次。这表示:

  • 如果您只需要将其提升一次,则分配一个处理程序。
  • 如果您附加相同的处理程序 4 次,那么它将被调用 4 次。

查看您的代码,而不是CurrentCellActivated多次挂钩事件,订阅一般CellActivated事件一次会更有意义。

于 2013-10-11T09:48:01.703 回答