多次附加事件处理程序

Bhu*_*anK 10 .net c# events delegates winforms

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

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

cr.ListControlPart.Grid.CurrentCellActivated += new EventHandler(Grid_CurrentCellActivated); 
Run Code Online (Sandbox Code Playgroud)

这段代码在代码中多次调用.

Ale*_*ria 20

亲自尝试一下:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个在线试用该程序的链接:https://dotnetfiddle.net/iW4eAN (20认同)
  • 它会多次调用该事件. (8认同)

Raj*_*ian 13

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

Object.Event -= EventHandler(method);
Object.Event += EventHandler(method);
Run Code Online (Sandbox Code Playgroud)

如果可以,通过总是在一个地方订阅事件来说明构造函数来阻止它

  • 当我们第一次尝试取消订阅事件处理程序尚未订阅时会发生什么? (5认同)
  • @Bhushan是的,即使最佳做法是在不使用时取消订阅事件.GC不会立即收集此信息 (3认同)
  • 这种方法有效,第一次订阅没有异常.(即 - =被默默地忽略). (3认同)
  • 只要您保留原始函数的句柄,就很好。这对于使用 lambda 或 `new` 关键字声明的匿名方法效果不佳;) (2认同)

Jam*_*mes 9

如果你继续附加事件处理程序,那么每次附加处理程序时它都会被引发一次.这意味着:

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

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