我刚开始接触C#。我只是想知道多次附加事件处理程序是否会导致意外结果?
实际上,在我的应用程序中,我正在将事件处理程序附加到一个事件中,例如
cr.ListControlPart.Grid.CurrentCellActivated += new EventHandler(Grid_CurrentCellActivated);
这行代码在代码中被多次调用。
自己试试:
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
在添加之前取消订阅即可预防此问题。
Object.Event -= EventHandler(method);
Object.Event += EventHandler(method);
如果可能的话,通过始终在一个地方订阅事件(比如构造函数)来防止它发生。
new
关键字声明的匿名方法,这种方法效果不佳 ;) - theMayer如果您不断添加事件处理程序,则每次附加处理程序时都会引发该事件。 这意味着:
查看您的代码,与其多次钩入CurrentCellActivated
事件,更有意义的是订阅一次通用的CellActivated
事件。