我想知道为什么EventArgs
构造函数不受保护,因为为每个事件分配空对象的资源似乎很浪费(尽管很小),尤其是当存在单个EventArgs.Empty
时这显然更有效率。这让我感到惊讶,特别是当.NET的其他部分确实有一个受保护/私有构造函数时,以避免多次,不必要的分配,例如Comparer<T>
。
是否存在创建new EventArgs()
(非子类)实际上有意义的情况,或者构造函数是否仅用于简化非经验开发人员的使用?
答案 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。您创建的任何子类都将利用这些子类并使其符合模式。