我试图正确地理解Events和EventArgs,但无法完全理解整个EventArgs.Empty属性。
EventArgs实现:
public static readonly EventArgs Empty;并允许我们创建一个EventHandler并使用以下方法调用它:
public event EventHandler<EventArgs> TestHappening;
private void MyMethod()
{
TestHappening( this, EventArgs.Empty );
}现在,我已经学习了许多基于EventArgs的类,它们似乎都没有实现这一点,所以我有点盲目,尽管我已经阅读了所有关于EventArgs.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 ) );
}发布于 2015-06-02 13:50:09
如果您真的需要Empty字段,您应该自己考虑。如果您不使用它,就不应该创建它。EventArgs类没有任何变量或属性,因此每次创建新实例都没有意义。在您的例子中,由于您有一个默认值,所以有两个“空”TestEventArgs更有意义,一个用于true,一个用于false (如果您真的愿意的话,这在您的场景中是有意义的)。
在您的实现过程中,您遗漏了一些其他要点,我已修正如下:
public class TestEventArgs : EventArgs
{
public static readonly TestEventArgs True = new TestEventArgs(true);
public static readonly TestEventArgs False = new TestEventArgs(false);
public bool UpdatedValue { get; private set; }
public TestEventArgs(bool updatedValue)
{
this.UpdatedValue = updatedValue;
}
public event EventHandler<TestEventArgs> TestHappening;
private void MyMethod()
{
EventHandler<TestEventArgs> eh = TestHappening;
eh?.Invoke(this, TestEventArgs.True);
}
}我改变的是:
Empty实例化为new TestEventArgs,因为这也是EventArgs.Empty的定义。关于最后一点:这取决于您是否打算让调用委托更改对象(它是传递一个实例与多个实例)。在您的例子中,由于实例不能被更改,所以没有多大关系。
https://stackoverflow.com/questions/30597904
复制相似问题