KDe*_*ker 0 c# events delegates
假设我有一个可以解雇某些事件的课程
public SomeTypeOfEvent SomeEvent;
public delegate void SomeTypeOfEvent();
public void FooBar()
{
if (SomeEvent != null)
SomeEvent();
}
Run Code Online (Sandbox Code Playgroud)
这是检查SomeEvent代表是否有订阅者的正确方法吗?我隐约记得有几次被告知这是不正确的,因为在检查代表和解雇之间可以删除用户的事件.
检查委托是否为空的正确/可接受的方法是什么?
这是非常好的方式,如果你不打扰多个线程.如果你是,那么这不是线程安全的,因为在!=检查的中间另一个线程可能使委托值为空,你将得到NullReferenceException.
在C#6.0中,正确的方法是SomeEvent?.Invoke()使用新的空条件运算符.
MSDN推荐它:
null条件成员访问的另一个用途是以线程安全的方式使用更少的代码调用委托.
PropertyChanged?.Invoke(e)
Run Code Online (Sandbox Code Playgroud)
在以前的C#版本中,您可以将委托值存储到临时变量中,这是正确的方法.
var handler = this.PropertyChanged;
if (handler != null)
handler(…)
Run Code Online (Sandbox Code Playgroud)