考虑这个片段:
class Foo
{
public event Action Event;
public void TriggerEvent()
{
if (Event != null) {
Event();
}
}
}
static void Handler()
{
Console.WriteLine("hi!");
}
static void Main()
{
var obj = new Foo();
obj.Event += Handler;
obj.Event += Handler;
obj.TriggerEvent();
Console.WriteLine("---");
obj.Event -= Handler;
obj.TriggerEvent();
}
我得到的输出:
hi!
hi!
---
hi!
最后一个“嗨!” 出乎意料。要删除它,我必须再打电话Event -= Handler;
一次。但是如果我不知道处理程序被绑定了多少次怎么办?
更新:知道这有点违反直觉的行为背后的原因会很有趣:为什么不-=
删除所有实例?
更新 2:我意识到由于与 jQuery 的不同,我发现这种行为违反直觉。
var handler = function() { console.log('hi!'); }, obj = {};
$(obj).on("event", handler).on("event", handler).trigger("event");
console.log("---");
$(obj).off("event", handler).trigger("event");
输出:
hi!
hi!
---