我正在使用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)
时,它会正常运行。
所以,我的问题是:在这种情况下,行为是否定义明确,代码实际应该做什么?
答案 0 :(得分:2)
首先
myObject.StateChanged += new EventHandler(ObjectStateChanged);
相当于
myObject.StateChanged += ObjectStateChanged;
。
这只是第一种语法的简写版本。
其次,自might have hooked a delegate multiple time
使用+=
以来,多次调用处理程序。
所以,你应该做的是先挂钩代表,确保你先挂钩以防已经挂钩:
myObject.StateChanged -= ObjectStateChanged;
myObject.StateChanged += ObjectStateChanged;