为什么EventArgs构造函数不受保护

本文关键字:受保护 构造函数 EventArgs 为什么 | 更新日期: 2023-09-27 17:57:52

我想知道为什么EventArgs构造函数没有受到保护,因为为每个事件为空对象分配资源似乎是浪费(尽管很小),尤其是当有一个单独的EventArgs.Empty时,它的使用效率显然更高。这让我很惊讶,尤其是当.NET的其他部分确实有一个受保护的/私有的构造函数来避免多个不必要的分配时,例如Comparer<T>

是否存在创建new EventArgs()(而不是子类)确实有意义的情况,或者构造函数只是为了方便没有经验的开发人员使用?

为什么EventArgs构造函数不受保护

我认为这是因为EventArgs类的ComVisible属性设置为true

以下FxCop规则支持这一点:

专门标记为对COM可见的引用类型包含公共参数化构造函数,但不包含公共默认(无参数)构造函数。

一个更大的问题是"为什么总是使用EventArgs,即使您的事件不需要任何信息?"。如果EventArgs没有公共构造函数,您将无法执行此操作。

一个很好的优点是,如果将来您确实想传递信息,任何现有的代码都将仍然编译。例如,下面的类一开始只使用EventArgs,但现在传递了一个包含一些"有用信息"的字符串。

class SomeEventSource
{
    public event EventHandler<SomeEventArgs> MyEvent;
    public void FireTheEvent()
    {
        MyEvent(this, new SomeEventArgs("This information is interesting"));
    }
}
class SomeEventArgs : EventArgs
{
    public SomeEventArgs(string interestingInformation)
    {
        InterestingInformation = interestingInformation;
    }
    public string InterestingInformation { get; private set; }
}

此客户端代码是在更改之前编写的,但它仍然可以编译。如果最初的版本没有使用EventArgs,那么实现更改的成本会更高。

class SomeClient
{
    private readonly SomeEventSource _source;
    public SomeClient()
    {
        _source = new SomeEventSource();
        _source.MyEvent += source_MyEvent;
    }
    public void RunTest()
    {
        _source.FireTheEvent();
    }
    void source_MyEvent(object sender, EventArgs e)
    {
        // Do something
    }
}

EventArg的构造函数上有一个注释,可以在某些情况下对其进行优化。EventArgs本身被标记为Serializable和ComVisible。您创建的任何子类都将利用这些优势并符合模式。