Jam*_*ord 5 c# null events delegates nullreferenceexception
我刚刚在程序中遇到一个错误,我正在编写一个异常被抛出的状态,说明"对象引用必须设置为对象的实例".经过调查,我发现在尝试触发事件时抛出了此异常,但事件没有添加任何委托方法.
我想检查一下我的理解是否正确,作为开发人员,如果没有先检查事件是否等于null,就不应该触发事件?例如:
if (this.MyEventThatIWantToFire != null)
{
this.MyEventThatIWantToFire();
}
Run Code Online (Sandbox Code Playgroud)
提前感谢您的建议/想法.
Jon*_*eet 10
您展示的模式在多线程环境中被破坏.MyEventThatIWantToFire在测试之后但在调用之前,它可能变为null.这是一种更安全的方法:
EventHandler handler = MyEventThatIWantToFire;
if (handler != null)
{
handler(...);
}
Run Code Online (Sandbox Code Playgroud)
请注意,除非你使用某种类型的内存屏障,也不能保证你会看到最新的一组用户,甚至忽略了明显的竞争条件.
但是,是的,除非您知道它将是非null ,否则您需要执行检查或使用帮助方法为您进行检查.
确保总是订户的一种方法是自己添加无操作用户,例如
public event EventHandler MyEventThatIWantToFire = delegate {};
Run Code Online (Sandbox Code Playgroud)
当然,事件不具有与简单的委托字段来实现.例如,您可以List<EventHandler>使用一个由空列表开头的事件来替换.那将是非常不寻常的.
事件本身永远不会为null,因为事件本身只是一对方法(添加/删除).有关更多详细信息,请参阅有关事件和代理的文章.
| 归档时间: |
|
| 查看次数: |
2794 次 |
| 最近记录: |