Pav*_*nin 6 .net c# events design-patterns
我们可以通过两种方式举办活动:
public event EventHandler MyEvent;
private void DoSomething()
{
...
var handler = MyEvent;
if (handler != null)
handler(this,EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)
和
public event EventHandler MyEvent = (o,e) => {} ;
private void DoSomething()
{
...
MyEvent(this, EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢最后一个.它更短.
我的同事坚持第一个变种.
第一个优先于第二个优势吗?
def*_*mer 11
C#6的更新
在C#6中,您只需使用空条件运算符,如下所示:
PropertyChanged?.Invoke(this, args);
Run Code Online (Sandbox Code Playgroud)
原始答案
Eric Lippert有一篇关于Events and Races的精彩博文,如果你没有,你应该阅读.
可以认为第一个选项比第二个选项更安全,因为事件可以设置为null.有人可能会不小心修改课程.此外,如果反序列化实例,则第二种方法将不起作用(取决于您使用的序列化机制).
我有时会使用辅助方法来引发事件
static class Raiser
{
public static void Raise<T>(this EventHandler<T> evnt, object sender, T args)
where T : EventArgs
{
if (evnt != null)
{
evnt(sender, args);
}
}
}
class SomeClass
{
public event EventHandler<EventArgs> MyEvent;
private void DoSomething()
{
MyEvent.Raise(this, EventArgs.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)