如何显式使用事件访问器

本文关键字:访问 事件 何显式 | 更新日期: 2023-09-27 17:50:43

下面是显式事件评估器的草图:

delegate void EventHandler (SomeObject m, EventArgs e);
EventHandler _priceChanged; //Private Delegate
public event EventHandler PriceChanged
{
    add {_priceChanged += value;}
    remove {_priceChanged -= value;}
}
  • 显然,这与标准实现之间的区别在于委托的使用不是线程安全的。我如何使这个线程安全?

  • 我如何允许这样的事情:

    if (PriceChanged != null)...   etc
    

如何显式使用事件访问器

试试这个:

 delegate void EventHandler (SomeObject m, EventArgs e);
 EventHandler _priceChanged; //Private Delegate
 private Object _myLock = new Object();
 public event EventHandler PriceChanged
 {
    add {
       lock(_myLock)
       {_priceChanged += value;}
    }
    remove {
       lock(_myLock)
       {_priceChanged -= value;} 
    }
 }
  • 显然,这与标准实现之间的区别在于委托的使用不是线程安全的。我如何使这个线程安全?

参考Shai的回答

  • 我如何允许这样的事情:
if (PriceChanged != null)...   etc

不能,不能在eventandler声明级别上——这总是需要在调用this的代码中完成。举个例子:_priceChanged为null的一个原因是,如果既没有调用add也没有调用remove,那么它们怎么能防止null异常呢?除非你想用一个虚拟的回调初始化你的委托集合,但那只是邪恶的。