这可能是明显的,但你可以声明你的事件指向一个no-op处理程序,然后你不需要在调用时检查null.
public event EventHandler MyEvent = delegate { };
Run Code Online (Sandbox Code Playgroud)
然后你可以调用指向的处理程序MyEvent而不检查null.
我猜原因是历史和一致性。
与其他类型的处理方式一致;例如,在处理问题时没有语言或平台帮助null- 程序员有责任确保永远不会实际使用 null 占位符 - 如果您希望调用方法的对象引用不为 null,则无法仅选择性地调用该方法, 毕竟。
这是历史,因为大多数类型默认情况下都包含空引用,尽管这不是必需的。也就是说,引用类型始终可以为空,而不是像值类型一样对待引用类型并需要额外的“可空性”注释来允许可为空。我确信在设计 Java 和 .NET 时,这是有原因的,但它引入了许多不必要的错误和复杂性,而这些错误和复杂性在强类型语言(例如 .NET 值类型)中很容易避免。但考虑到历史上包含了null类型系统范围内的“无效”值,可以这么说,对代表来说这样做也是很自然的。