在C#中提升事件:表现和优雅

M.A*_*nin 4 .net c# events lambda delegates

习惯于VB.NET,我习惯于"只是举起事件".当然,自定义事件有所不同,但是"常规"事件 - 我不需要Nothing在提升之前检查代表是否是.

使用C#,我发现自己重复这种模式:

if (myHandler != null) 
{
    myHandler(this, new EventArgs());
}
Run Code Online (Sandbox Code Playgroud)

我以为以下模式可能会更优雅:

  1. myHandler初始化为一个空的lambda: myHandler = (sender, e) => { };
  2. 预计myHandler永远不会为null,所以提升只会变成: myHandler(this, new EventArgs());

这种模式会比前一种模式更多或更少吗?我还应该考虑其他重要因素吗?

Mar*_*ell 5

这在建筑中是额外的事情,但它不会是巨大的开销.需要注意的一点是,某些序列化框架DataContractSerializer(如(WCF))不运行构造函数或字段初始值设定项,因此它可能不是非null.就个人而言,如果您的大部分活动都是EventHandler,我可能会尝试使用扩展方法:

public static void SafeInvoke(this EventHandler handler, object sender) {
    if (handler != null) handler(sender, EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)

然后:

SomeEvent.SafeInvoke(this);
Run Code Online (Sandbox Code Playgroud)

虽然坦率地说,我很少使用null-check来解决问题; p

另一个缺点是,如果你有足够的事件,这是一个问题,你可能应该使用EventHandlerList- 而这种方法将无法使用EventHandlerList.