Kur*_*Liu 23 c# events delegates
可能重复:
在事件声明中添加匿名空委托是否有缺点?
为事件定义一个空委托主体是一个好习惯,这样您就不必担心引发没有事件处理程序的事件了吗?(无需检查事件是否为空).
像下面的代码:
public event EventHandler<LoadEventArgs> LoadedData = delegate { };
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 39
我当然觉得它很有用,是的.将会有一个微小的,微小的性能成本 - 但不必执行无效测试的可读性的好处使它值得IMO.
值得指出的是,这是使用匿名方法而不是lambda表达式的好几次之一 - 否则你必须命名你将要忽略的参数,如下所示:
public event EventHandler<LoadEventArgs> LoadedData = (sender, args) => {};
Run Code Online (Sandbox Code Playgroud)
我不喜欢说出我不打算使用的东西:)
我不会这样做。
有两个原因。首先,null在调用它之前简单地检查处理程序是标准的。在示例、Microsoft 参考源和手册中随处可见。
其次,以这种方式初始化事件会在创建类时分配不必要的对象。这会给您的应用程序带来额外的内存压力,而不是真正需要。这是因为:
public event EventHandler<LoadEventArgs> LoadedData = delegate { };
Run Code Online (Sandbox Code Playgroud)
翻译成:
public event EventHandler<LoadEventArgs> LoadedData = new EventHandler<LoadEventArgs>delegate { });
Run Code Online (Sandbox Code Playgroud)
如果您还没有这样做,将您的事件包装在特定的方法中会有很大帮助:
public event EventHandler MyEvent;
protected virtual void OnMyEvent(EventArgs e)
{
if (MyEvent != null)
MyEvent(this, e);
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法使该线程安全(r):
public event EventHandler MyEvent;
protected virtual void OnMyEvent(EventArgs e)
{
var handler = MyEvent;
if (handler != null)
handler(this, e);
}
Run Code Online (Sandbox Code Playgroud)