+ =带事件的运算符

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回调)。

为了阻止这种行为我们有事件 。 当您使用事件时,编译器不允许您这样做,您只能使用+ =和 – =添加/删除您自己的委托。 无论如何,这就是我试图区分它的方式。 希望能帮助到你。

它为事件添加了处理程序。 这意味着当事件将会发生时,将调用操作员右侧的方法。