我记得在多次阅读以及多个地点看到过这样的说法:当触发典型事件时:
protected virtual OnSomethingHappened()
{
this.SomethingHappened(this, EventArgs.Empty);
}
如果没有有趣的事件参数,应该使用EventArgs.Empty而不是null。
我在我的代码中遵循了指导方针,但我意识到我不清楚为什么这是首选技术。为什么规定的协议更喜欢使用EventArgs.Empty而不是null?
我认为 NOT NULL 的原因是,当它作为参数传递时,不希望方法需要处理潜在的空引用异常。
如果您传递 null,并且方法尝试对其进行操作,它将获得空引用异常;但如果使用 EventArgs.Empty,则不会有此问题。
我认为EventArgs.Empty
用于保持传递事件参数的惯例,即使不需要任何参数。
Mitchel Sellers在我的帖子中间发布了另一半原因:它可以防止方法尝试对该参数执行某些操作(而不仅仅是检查它是否为空)导致空引用异常。
EventArgs.Empty
基本上执行全局定义的事件参数的工作,没有其他信息。
举个类似的例子来保持惯例,我们的团队使用string.Empty
来初始化字符串,否则不同的编码人员可能会使用newString = "";或 newString = " ";或 newString = null;
,所有这些都可能为不同的检查条件产生不同的结果。
使用EventArgs.Empty
而不是new EventArgs()
的一个(稍微迂腐的)原因是前者不会初始化新的EventArgs
,从而节省了一点内存。
如果您正在使用一个通用的方法,它具有从任何事件处理程序调用的EventHandler
签名,并传递了object sender
和EventArgs e
,那么它可以调用e.ToString()
,例如用于记录事件,而不必担心空指针异常。
来自Albahari书籍:"为了避免不必要地实例化EventArgs的实例。"
null
无法创建 EventArgs
的实例。 - Greg D我曾经使用了很长时间的"new EventArgs()"而不是"EventArgs.Empty"...... 我认为重要的是传递一些不会引起空异常的东西。