2011-02-28 66 views
10

基本上,我已经看到了这个使用的所有经常:为什么在调用它之前为事件分配一个处理程序?

public event MyEventHandler MyEvent; 

    private void SomeFunction() 
    { 
     MyEventHandler handler = this.MyEvent; 

     if (handler != null) 
     { 
      handler(this, new MyEventArgs()); 
     } 
    } 

当可以很容易地完成像这样:

public event MyEventHandler MyEvent; 

    private void SomeFunction() 
    { 
     if (MyEvent != null) 
     { 
      MyEvent(this, new MyEventArgs()); 
     } 
    } 

所以,我失去的东西吗?是否有一些人将事件分配给处理程序,然后提升处理程序而不是事件本身?这只是“最佳做法”吗?

回答

10

分配给本地变量保证,如果事件获取if和实际调用之间注销,调用列表将不为空(因为变量都会有原始调用列表的副本)。

这很容易发生在多线程代码中,在检查null和触发事件之间可能会被另一个线程取消注册。

请参阅this SO问题和答案。

2

线程安全。

如果在检查MyEvent是否为空并且您启动MyEvent时另一个线程出现并取消订阅该事件,会发生什么情况?

相关问题