このスニペットを検討してください。
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!
---