正确实现EventArgs

时间:2015-06-02 13:44:49

标签: c# events eventargs

我正在尝试正确理解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 );
}

1 个答案:

答案 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);
        }
    }
}

我改变了什么:

  1. Empty实例化为new TestEventArgs,因为这也是EventArgs.Empty的定义。
  2. 我已经实现了事件处理程序的线程安全版本(代码中的第二个示例)。如果订阅事件的事件处理程序列表发生更改,则您的第一个示例不安全。你的第二个是,因此你应该选择。
  3. 关于你的最后一点:这取决于你是否打算让调用委托更改对象(它传递一个实例与多个实例)。在您的情况下,由于实例无法更改,因此无关紧要。