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

时间:2011-05-27 08:56:27

标签: c# events singleton

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

是否存在创建new EventArgs()(非子类)实际上有意义的情况,或者构造函数是否仅用于简化非经验开发人员的使用?

2 个答案:

答案 0 :(得分:6)

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

以下FxCop rule支持此功能:

  

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

答案 1 :(得分:2)

更大的问题是“为什么总是使用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。您创建的任何子类都将利用这些子类并使其符合模式。