C# - 订阅时没有处理程序类型的奇怪事件行为

时间:2013-12-29 18:21:16

标签: c# events .net-3.5

我正在使用C#.NET 3.5构建一个游戏项目,并且错误地输入了几个事件订阅,但结果代码仍然编译并且行为非常奇怪。

通常,当您订阅C#事件时,您将声明事件处理程序的类型(委托)以及将实际处理该事件的函数的名称,如下所示:

myObject.StateChanged += new EventHandler(ObjectStateChanged);

private void ObjectStateChanged(object sender, EventArgs e) {
    // handle event here...
    }

我在一些地方写的是:

MyObject.StateChanged += ObjectStateChanged;

因此它在没有明确声明事件处理程序类型的情况下订阅该事件。这会产生各种奇怪的行为,主要是重复调用(在一个playtest中,当事件被触发一次时,事件处理程序被调用了4次)。但是代码会编译,当用+= ObjectStateChanged替换+= new EventHandler(ObjectStateChanged)时,它会正常运行。

所以,我的问题是:在这种情况下,行为是否定义明确,代码实际应该做什么?

1 个答案:

答案 0 :(得分:2)

首先

myObject.StateChanged += new EventHandler(ObjectStateChanged);

相当于

myObject.StateChanged += ObjectStateChanged;

这只是第一种语法的简写版本。

其次,自might have hooked a delegate multiple time使用+=以来,多次调用处理程序。

所以,你应该做的是先挂钩代表,确保你先挂钩以防已经挂钩:

myObject.StateChanged -= ObjectStateChanged;
myObject.StateChanged += ObjectStateChanged;