首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确实现EventArgs空

正确实现EventArgs空
EN

Stack Overflow用户
提问于 2015-06-02 13:44:48
回答 1查看 2K关注 0票数 3

我试图正确地理解EventsEventArgs,但无法完全理解整个EventArgs.Empty属性。

EventArgs实现:

代码语言:javascript
复制
public static readonly EventArgs Empty;

并允许我们创建一个EventHandler并使用以下方法调用它:

代码语言:javascript
复制
public event EventHandler<EventArgs> TestHappening;

private void MyMethod()
{
    TestHappening( this, EventArgs.Empty );
}

现在,我已经学习了许多基于EventArgs的类,它们似乎都没有实现这一点,所以我有点盲目,尽管我已经阅读了所有关于EventArgs.Empty的文档。根据文档,“空值是EventArgs的一个只读实例,相当于调用EventArgs构造函数的结果”。

基于此,我创建了以下实现:

代码语言:javascript
复制
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方面有两个主要的差异。哪个被认为是“更”正确的?:

代码语言:javascript
复制
OnTestHappening( new TestEventArgs( false ) );

private void OnTestHappening( TestEventArgs e )
{
    var handler = TestHappening;

    if ( handler != null )
        handler( this, e );
}

vs

代码语言:javascript
复制
OnTestHappening( true );

private void OnTestHappening( bool foo )
{
    var handler = TestHappening;

    if ( handler != null )
        handler( this, new TestEventArgs( foo ) );
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-02 13:50:09

如果您真的需要Empty字段,您应该自己考虑。如果您不使用它,就不应该创建它。EventArgs类没有任何变量或属性,因此每次创建新实例都没有意义。在您的例子中,由于您有一个默认值,所以有两个“空”TestEventArgs更有意义,一个用于true,一个用于false (如果您真的愿意的话,这在您的场景中是有意义的)。

在您的实现过程中,您遗漏了一些其他要点,我已修正如下:

代码语言:javascript
复制
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);
    }
}

我改变的是:

  1. Empty实例化为new TestEventArgs,因为这也是EventArgs.Empty的定义。
  2. 我已经实现了事件处理程序的线程安全版本(代码中的第二个示例)。如果事件处理程序列表订阅了事件更改,则第一个示例是不安全的。你的第二个是,所以你应该选择。

关于最后一点:这取决于您是否打算让调用委托更改对象(它是传递一个实例与多个实例)。在您的例子中,由于实例不能被更改,所以没有多大关系。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30597904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档