检查事件代表是否无效的正确方法?

时间:2016-03-14 14:41:13

标签: c# events delegates

假设我有一个可以解雇某些事件的课程

public SomeTypeOfEvent SomeEvent;
public delegate void SomeTypeOfEvent();
public void FooBar()
{
    if (SomeEvent != null)
        SomeEvent();
}

这是检查SomeEvent代表是否有订阅者的正确方法吗?我隐约记得有几次被告知这是不正确的,因为在检查代表和解雇之间可以删除用户的事件。

检查委托是否为空的正确/可接受的方式是什么?

2 个答案:

答案 0 :(得分:6)

如果您不打扰多个线程,这是非常好的方式。如果你是,那么这不是线程安全的,因为在!=检查的中间,另一个线程可能使委托值为空,你将获得NullReferenceException

在C#6.0中,正确的方法是SomeEvent?.Invoke()使用新的空条件运算符。

MSDN推荐它:

  

null条件成员访问的另一个用途是调用委托   以线程安全的方式使用更少的代码。

PropertyChanged?.Invoke(e)

在以前的C#版本中,您可以将委托值存储到临时变量中,这是正确的方法。

var handler = this.PropertyChanged;
if (handler != null)
    handler(…)

答案 1 :(得分:0)

我通常这样做(还没有使用C#6.0)。

public event EventHandler SomeEvent;

private void OnSomeEvent() {
    var someEvent = SomeEvent;
    if (someEvent != null) {
        someEvent(this, EventArgs.Empty);
    }
}