假设我有一个可以解雇某些事件的课程
public SomeTypeOfEvent SomeEvent;
public delegate void SomeTypeOfEvent();
public void FooBar()
{
if (SomeEvent != null)
SomeEvent();
}
这是检查SomeEvent
代表是否有订阅者的正确方法吗?我隐约记得有几次被告知这是不正确的,因为在检查代表和解雇之间可以删除用户的事件。
检查委托是否为空的正确/可接受的方式是什么?
答案 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);
}
}