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

时间:2010-03-05 10:52:01

标签: c# delegates

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

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(); 
  ...
 }
}

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

由于

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

第一个是适用的解决方案,但是调用额外的空委托时性能损失非常小。

第二种解决方案不是线程安全的(如果它对你很重要,原因)。

您应该使用以下内容:

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

答案 2 :(得分:1)

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

我们减少了这个:

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

MyEvent.SafeTrigger(...);