为什么使用EventArgs.为空而不是null

本文关键字:null EventArgs 为什么 | 更新日期: 2023-09-27 17:48:52

我记得在多个场合和多个位置读到,当触发典型事件时:

protected virtual OnSomethingHappened()
{
    this.SomethingHappened(this, EventArgs.Empty);
}

e应为EventArgs。如果没有感兴趣的事件参数,则为空,而不是null。

我遵循了代码中的指导,但我意识到我不清楚为什么这是首选技术。为什么声明的合同更喜欢EventArgs。空过空?

为什么使用EventArgs.为空而不是null

我相信NOT NULL背后的原因是,当作为参数传递时,该方法不需要潜在地处理NULL引用异常。

如果您传递null,并且该方法尝试对e执行某些操作,那么它将获得一个带有EventArgs的null引用异常。清空它不会。

EventArgs.Empty是Null对象模式的一个实例。

基本上,有一个表示"无值"的对象,以避免在使用它时检查null。

我相信EventArgs.Empty用于维护通过事件传递参数的约定,即使不需要任何参数。

Mitchel Sellers在帖子的中途发布了我的另一半理由:如果一个方法尝试对该参数执行操作(除了检查它是否为null),它可以防止null引用异常。

EventArgs.Empty基本上是在没有附加信息的情况下完成全局定义的事件参数的工作。

为了给出一个类似的维护约定的例子,我们的团队使用string.Empty来初始化字符串,因为否则不同的编码器可能会使用newString = ""; or newString = " "; or newString = null;,所有这些都可能针对不同的检查条件产生不同的结果。

使用EventArgs.Emptynew EventArgs()的一个(有点迂腐)原因是前者不会初始化新的EventArgs,从而节省了少量内存。

如果您使用的通用方法具有从任何事件处理程序调用的EventHandler签名,并且同时传递给object senderEventArgs e,则它可以调用e.ToString(),例如,用于记录事件,而无需担心空指针异常。

我使用了长时间的"new EventArgs()"而不是"EventArgs.Empty"…我认为重要的是传递一些不会导致Null异常的东西。

来自Albahari图书:"in order to avoid unnecessarily instantiating an instance of EventArgs."