【问题标题】:Why is the EventArgs constructor not protected?为什么 EventArgs 构造函数不受保护?
【发布时间】:2011-05-27 08:56:27
【问题描述】:

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

在任何情况下,创建new EventArgs()(不是子类)实际上是有意义的,还是构造函数只是为了方便没有经验的开发人员使用?

【问题讨论】:

  • 可能与序列化有关?我对默认的二进制序列化了解不多,但它可能是相关的......
  • 如果你要去那里....为什么object 不是一个带有abstract 构造函数的protected 类;p(我们应该在这里假设一个合理的类应该是为同步锁提供;可能是 Monitor 的实例;p)

标签: c# events singleton


【解决方案1】:

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

以下FxCop rule支持:

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

【讨论】:

  • 您能否详细说明为什么会产生影响?我对 COM 不是特别熟悉。
  • +1 几乎可以肯定这是正确的。 COM 没有参数化构造函数,因此 ComVisible 类必须有一个公共的默认构造函数。
【解决方案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。您创建的任何子类都将利用这些优势并适应模式。

【讨论】:

    猜你喜欢
    • 2013-08-04
    • 2020-09-17
    • 1970-01-01
    • 2016-04-07
    • 2010-11-06
    • 2022-12-11
    • 2019-11-18
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多