使用没有attatched委托方法在C#中触发事件?

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,因为事件本身只是一对方法(添加/删除).有关更多详细信息,请参阅有关事件和代理的文章.