+ =带事件的运算符
public void Bar() { Foo foo = new Foo(); **foo.MyEvent += foo_MyEvent;** foo.FireEvent(); } void foo_MyEvent(object sender, EventArgs e) { ((Foo)sender).MyEvent -= foo_MyEvent; }
嘿,我对事件有点不熟悉,有人能告诉我+ =运算符对事件的影响吗?
+=
订阅活动。 +=
右侧的委托或方法将被添加到事件跟踪的内部列表中,当拥有类触发该事件时,将调用列表中的所有委托。
您接受的答案是+=
简化版本,但并不是完整的故事。
+=
运算符调用事件的add方法。 同样-=
调用删除。 这通常会导致委托被添加到事件触发时调用的内部处理程序列表中,但并非总是如此 。
完全可以定义add来做其他事情。 此示例可能有助于演示调用+=
时发生的情况:
class Test { public event EventHandler MyEvent { add { Console.WriteLine("add operation"); } remove { Console.WriteLine("remove operation"); } } static void Main() { Test t = new Test(); t.MyEvent += new EventHandler (t.DoNothing); t.MyEvent -= null; } void DoNothing (object sender, EventArgs e) { } }
输出:
添加操作 删除操作
有关更多信息,请参阅Jon Skeet关于事件和代表的文章。
在这种情况下,方法foo_MyEvent将在调用该事件时触发(因此您在第4行中订阅该事件)
事件只是委托的不可变列表(即在发布/调用该事件时将调用的订阅)。 你可以说我们可以使用List代替。 如果我们这样做,有人可能会对我们的订阅者进行调整。
在上面使用List的场景中,您可以:
lstDelegate = newDelegate
并且您已擦除现有订阅者(lstDelegate现在仅包含ur delegate回调)。
为了阻止这种行为我们有事件 。 当您使用事件时,编译器不允许您这样做,您只能使用+ =和 – =添加/删除您自己的委托。 无论如何,这就是我试图区分它的方式。 希望能帮助到你。
它为事件添加了处理程序。 这意味着当事件将会发生时,将调用操作员右侧的方法。