我正在尝试正确理解var existingObject = {};
existingObject.property1 = {}; //without prefixing with var
和Events
,但无法完全理解整个EventArgs
属性。
EventArgs.Empty
实现:
EventArgs
并允许我们创建public static readonly EventArgs Empty;
并使用以下方法调用它:
EventHandler
现在我已经研究了许多基于EventArgs
的课程,但是他们似乎都没有实现这一点所以即使我已经阅读了所有关于{{{{{{ 3}}。根据文档,“Empty的值是EventArgs的只读实例,相当于调用EventArgs构造函数的结果”。
基于此,我创建了以下实现:
public event EventHandler<EventArgs> TestHappening;
private void MyMethod()
{
TestHappening( this, EventArgs.Empty );
}
使用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
VS
OnTestHappening( new TestEventArgs( false ) );
private void OnTestHappening( TestEventArgs e )
{
var handler = TestHappening;
if ( handler != null )
handler( this, e );
}
答案 0 :(得分:2)
如果你真的需要Empty
字段,你应该自己考虑一下。如果您不使用它,则不应创建它。 EventArgs
类没有任何变量或属性,因此每次创建新实例都没有意义。在您的情况下,由于您有一个默认值,因此有两个'空'TestEventArgs
更合理,一个用于true
,一个用于false
(如果您真的想要和它在您的场景中是有意义的。)
您在实施中遗漏了一些其他要点,我在下面修正了这些要点:
public class TestEventArgs : EventArgs
{
public static new readonly TestEventArgs True = new TestEventArgs(true);
public static new 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;
if (eh != null)
{
eh(this, TestEventArgs.Empty);
}
}
}
我改变了什么:
Empty
实例化为new TestEventArgs
,因为这也是EventArgs.Empty
的定义。关于你的最后一点:这取决于你是否打算让调用委托更改对象(它传递一个实例与多个实例)。在您的情况下,由于实例无法更改,因此无关紧要。