我试图正确理解 Events
和EventArgs
,但我无法完全掌握整个EventArgs.Empty
属性。
EventArgs
实现:
public static readonly EventArgs Empty;
它允许我们创建一个事件处理程序
并使用以下方式调用:
public event EventHandler<EventArgs> TestHappening;
private void MyMethod()
{
TestHappening( this, EventArgs.Empty );
}
现在我已经学习了许多基于
EventArgs
的类,但它们似乎都没有实现这个功能,所以尽管我已经阅读了关于EventArgs.Empty
的所有文档,但我还是有点不知所措。 根据文档,“Empty的值是一个只读的EventArgs实例,等同于调用EventArgs构造函数的结果”。
基于此,我创建了以下实现:
public class TestEventArgs : EventArgs
{
public static readonly TestEventArgs Empty;
public bool UpdatedValue { get; private set; }
TestEventArgs()
: this( false )
{
}
public TestEventArgs( bool updatedValue )
{
this.UpdatedValue = updatedValue;
}
}
public event EventHandler<TestEventArgs> TestHappening;
private void MyMethod()
{
TestHappening( this, EventArgs.Empty );
}
TestEventArgs.Empty
的使用是在实例化一个类还是做了什么?
此外,即使我检查的所有子类都没有使用Empty
,它们仍然可以使用,这不会让人感到困惑吗?
最后,根据我研究的各种文档,有两个主要变化,关于何时实际实例化EventArgs
。哪一个被认为是“更”正确的呢?
OnTestHappening( new TestEventArgs( false ) );
private void OnTestHappening( TestEventArgs e )
{
var handler = TestHappening;
if ( handler != null )
handler( this, e );
}
vs
OnTestHappening( true );
private void OnTestHappening( bool foo )
{
var handler = TestHappening;
if ( handler != null )
handler( this, new TestEventArgs( foo ) );
}
new EventArgs()
,但这是浪费的,EventArgs.Empty是一种廉价的替代方法。 - Hans Passant