- 如果我使用初始空委托定义事件,我不需要检查空
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();
...
}
}
这些有什么区别?在什么情况下,一个比另一个更好?
由于
答案 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(...);