我回想起在多个场合和多个位置读到的关于触发典型事件的信息:
protected virtual OnSomethingHappened()
{
this.SomethingHappened(this, EventArgs.Empty);
}
如果没有有趣的事件参数,则e应该为EventArgs.Empty,而不是null。
我遵循了代码中的指导,但是我意识到我不清楚为什么这是首选技术。为什么指定的合同比空值更喜欢EventArgs.Empty?
Answers:
我相信NOT NULL背后的原因是,当作为参数传递时,该方法不需要潜在地处理null引用异常。
如果传递null,并且该方法尝试使用e进行操作,则它将获得null引用异常,而使用EventArgs.Empty则不会。
我相信EventArgs.Empty
,即使不需要任何东西,也可以用来保持将参数传递给事件的约定。
Mitchel Sellers在我的帖子的一半发布了我的另一半理由:如果方法尝试对该参数执行某项操作(除了检查它是否为null之外),它可以防止null引用异常。
EventArgs.Empty
基本上是在没有其他信息的情况下完成全局定义的事件参数的工作。
为了给出类似的约定惯例,我们的团队使用string.Empty
了初始化字符串的方法,因为否则可能会使用不同的编码人员newString = ""; or newString = " "; or newString = null;
,所有这些人员对于不同的检查条件可能会产生不同的结果。
使用EventArgs.Empty
vs的一个(有点古怪的)理由new EventArgs()
是前者不初始化新的EventArgs
,节省了少量的内存。
我使用了很长时间的“ new EventArgs()”而不是“ EventArgs.Empty” ...我认为重要的是传递不会导致Null异常的内容。