繁体   English   中英

我应该在派生的事件args类(即EventArgs.Empty)中实现空对象模式吗? 如果是这样-最好的方法是什么?

[英]Should I implement null object pattern in my derived event args class (i.e. EventArgs.Empty)? If so - what's the best way?

System.EventArgs实现了null对象模式的一种变体-开发人员使用EventArgs.Empty而不是null来指定“此处没有有趣的情况”,以期减轻用户不得不处理可能的null引用异常的可能性。

我用派生的事件args类声明我自己的事件,例如ContosoEventArgs我认为让消费者能够传递类似ContosoEventArgs.Empty东西是很自然的(只是EventArgs.Empty不起作用,因为这是尝试将基类的实例分配给派生类的变量)。 但是,这很难实现-Empty静态属性不依赖于可以在派生类中设置的某些受保护属性IsEmpty。 如果可以,我可以做类似的事情:

public class ContosoEventArgs : EventArgs
{
    public static ContosoEventArgs Empty
    {
        get
        {
            return new ContosoEventArgs{IsEmpty=true};
        }
    }
}

干净整洁!

但是,此属性不存在,据我所知,测试EventArgs实例的Empty-ness的唯一方法是与EventArgs.Empty进行比较。 这意味着我现在需要实现操作符==重载...和操作符!=,以及Equals(...)和GetHashCode()...所有这些样板程序只是为了让我的特殊事件args遵循基本EventArgs

我应该只允许空值吗? 我认为这几乎是他们在框架本身中所做的-MouseEventArgs和ImageClickEventArgs不会显示出空对象模式实现的痕迹

还是我忽略了第三种选择?

我认为您可以在不重载相等成员的情况下使用此代码:

public class ContosoEventArgs : EventArgs
{
    public new static readonly ContosoEventArgs Empty = new ContosoEventArgs();
}

如果您查看EventArgs,它将使用静态实例进行比较:

 [ComVisible(true)]
[__DynamicallyInvokable]
[Serializable]
public class EventArgs
{
    [__DynamicallyInvokable]
    public static readonly EventArgs Empty = new EventArgs();

    static EventArgs()
    {
    }
    [__DynamicallyInvokable]
    [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    public EventArgs()
    {
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM