2010-07-28 27 views
13
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; 
} 

嘿,我对事件有点不熟悉,有人能告诉我+ =运算符在事件中做了什么吗?+ =有事件的运算符

回答

31

+=订阅事件。 +=右侧的委托或方法将被添加到事件跟踪的内部列表中,当拥有的类触发该事件时,列表中的所有委托将被调用。

+15

和' - ='取消订阅 – CaffGeek 2010-07-28 19:04:23

0

它为事件添加处理程序。这意味着当事件上升时,将调用操作符右侧的方法。

1

在这种情况下,方法foo_MyEvent将触发whene该事件被称为(所以你订阅事件中第4行)

17

你接受的答案是什么+=做了很好的简化版本,但它不是完整的故事。

+=运算符在事件上调用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) 
    { 
    } 
} 

输出:

 
add operation 
remove operation 

见乔恩斯基特对events and delegates文章以获取更多信息。

+1

这是准确的。我的回答应该反映你在框架类上发现的所有事件的行为,但是如果你订阅别人的事件可能不会发生什么。 – mquander 2010-07-28 19:38:45

1

事件只是代理的不可变列表(即当发布/调用该事件时会调用的订阅)。你可以争辩说我们可以用List来代替。如果我们这样走了,有人可能会和我们的用户一起锻炼。

在您使用列表上方的情况下,你可以这样做:

lstDelegate = newDelegate

和你清除现有用户(lstDelegate只包含乌尔委托回调现在)。

要停止这种行为,我们有事件。当你使用事件时,编译器不会允许你这样做,你只能使用+ =和 - =来添加/删除你自己的委托。无论如何,我都会试着去区分它。希望能帮助到你。