为什么EventArgs构造函数不受保护
本文关键字:受保护 构造函数 EventArgs 为什么 | 更新日期: 2023-09-27 17:57:52
我想知道为什么EventArgs
构造函数没有受到保护,因为为每个事件为空对象分配资源似乎是浪费(尽管很小),尤其是当有一个单独的EventArgs.Empty
时,它的使用效率显然更高。这让我很惊讶,尤其是当.NET的其他部分确实有一个受保护的/私有的构造函数来避免多个不必要的分配时,例如Comparer<T>
。
是否存在创建new 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。您创建的任何子类都将利用这些优势并符合模式。