Cle*_*ang 3 c# null events delegates handler
我已经看到了各种编码样式来在C#中触发事件.第一种风格包括以下内容:
-an事件处理程序
public delegate void NumberReachedEventHandler(object sender,
NumberReachedEventArgs e);
Run Code Online (Sandbox Code Playgroud)
-一个事件
public event NumberReachedEventHandler NumberReached;
Run Code Online (Sandbox Code Playgroud)
- 以及触发事件的方法
protected virtual void OnNumberReached(NumberReachedEventArgs e)
{
if(NumberReached != null)
{
NumberReached(this, e);
}
}
Run Code Online (Sandbox Code Playgroud)
然而,第二种风格有一种不同的方法来触发事件:
protected virtual void OnNumberReached(NumberReachedEventArgs e)
{
NumberReachedEventHandler handler = NumberReached;
if(handler != null)
{
handler(this, e);
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,似乎一个样式检查"event"是否为null,第二个样式检查委托是否为null.但是,我的理解是一个事件只是一个委托的实例,所以我想知道编写代码的方式是否有任何优势.如果是,请解释.提前致谢.
Eri*_*ert 11
两者都在检查与事件关联的委托是否为空.
存储到本地的目的是防止多线程代码中的TOCTOU风格竞争.
值得注意的是,使用本地只能消除两种潜在种族中的一种.有关详细信息,请参阅我在2009年关于此主题的文章:http://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and-races.aspx
还有这个问题: