繁体   English   中英

添加新事件的以下代码之间有什么区别

[英]What's the difference between following code for adding new events

- 如果我用一个初始空委托定义一个事件,我不需要检查null

class MyClass
{
 public event EventHandler<MyEventArgs> MyEvent = delegate { };

 void SomeMethod()
 {
  ...
  MyEvent(); // No need to check for null
  ...
 }
}

- 否则我需要检查null

class MyClass
{
 public event EventHandler<MyEventArgs> MyEvent;

 void SomeMethod()
 {
  ...
  if (MyEvent != null) // No need to check for null
   MyEvent(); 
  ...
 }
}

这些有什么区别? 在什么情况下,一个比另一个好?

谢谢

赞成的回答是非常错误的,我必须回答。 互联网上有人错了,还不能上床睡觉。

它很方便,但不是免费的。 编译器必须为匿名方法生成一个类,JIT编译器必须为它生成代码。 并且无论客户端是否订阅了事件处理程序,该代码始终在您引发事件时执行。 空检查代码也始终执行,但这需要更少的代码和时间。

这不是很多代码和很多时间。 空检查需要2个机器代码指令,并且应该在单个CPU周期中执行。 匿名代表需要大约一个数量级,但在现代机器上仍然不是很多。 就个人而言,我太老了,不能像那样浪费,两个总是我的选择。

至少因为这是标准模式,每个人都认识到它。

第一个是适用的解决方案,但是调用额外的空委托几乎没有性能损失。

第二种解决方案不是线程安全的(如果它对您有意义,原因)。

您应该使用以下内容:

var handler = MyEvent;
if (handler != null )
  handler(this, new MyEventArgs());

在我们公司,我们编写了一个扩展方法,它挂接到大多数事件,并在调用之前检查它是否为null。

我们减少了这个:

var handler = MyEvent;
if (handler != null)
{
    handler(...);
}

MyEvent.SafeTrigger(...);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM