【问题标题】:Why can't I just use EventHandler<int> instead of deriving from EventArgs为什么我不能只使用 EventHandler<int> 而不是从 EventArgs 派生
【发布时间】:2015-08-04 18:59:18
【问题描述】:

EventHandler&lt;TEventArgs&gt; 的文档说:

第二个参数是从EventArgs和supply派生的类型 保存事件数据所需的任何字段或属性。

而且似乎在整个 .Net 文档中都被普遍推荐。

但事实证明,我可以执行以下操作,效果很好:

public event EventHandler<int> Panned;

并调用事件处理程序:

int value = 10;
if (Panned != null)
{
    Panned(this, value);
}

在观察者方面:

subject.Panned += (sender, e) =>
{
    Console.WriteLine(e);
};

在我看来,这似乎比用继承自 EventArgs 的小类或 Does .NET have a built-in EventArgs<T>? 建议的通用 EventArgs 乱扔代码要好

那么为什么需要我从EventArgs 继承EventHandler 泛型参数?

【问题讨论】:

  • 如果您使用 .NET 4.0 或更早版本,public event EventHandler&lt;int&gt; Panned; 将失败。 In 4.0 它有一个 where TEventArgs : EventArgs 约束。该约束已被删除in 4.5
  • 哦,有趣。很高兴知道这一点。

标签: c# .net


【解决方案1】:

如果您需要做的只是将int 传递给处理程序,那么您所做的一切都很好。

曾经是这种情况(.NET 4.5之前)EventHandler 类型参数TEventArgs 被限制为从EventArgs 继承,但现在不是了:

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

MS 放弃约束的事实应该告诉你他们太严格了,你正在做的很好。

如果您需要将复杂类型传递给处理程序,那么出于多态性的原因,您也可以继承EventArgs。此外,EventArgs.Empty 成员也很有用。

【讨论】:

  • 另外,如果您的事件没有与默认 EventHandler 委托的派生类连接,如果您尝试使用Register-ObjectEvent
【解决方案2】:

这只是一个约定。事实上,您甚至不必使用EventHandler&lt;&gt; 泛型委托。你可以:

public event Action SomeEvent;

public void OnAction()
{
    var a = this.SomeEvent;
    if (a != null)
    {
        a();
    }
}

当然,约定的存在是有原因的。据我所知,每个 标准 .NET 事件都遵循使用返回 void 的委托的模式,该委托采用 object 参数和 EventArgs 的第二个参数或派生类型。这样可以轻松使用这些事件,而无需每次都参考文档。

傻,傻,傻!

这行得通吗?...

class Program
{
    public static event Func<int> SomeEvent;

    static void Main(string[] args)
    {
        SomeEvent += () => 7;
        SomeEvent += () => 8;
        var a = SomeEvent();
        Console.WriteLine(a);
    }
}

我试过了:确实如此!当然,委托有返回值的事件是很奇怪的,因为如果有多个附加的处理程序,哪个处理程序的值将返回给调用者并不明显。在上面的例子中,原来8被写入了控制台。

有趣但我怀疑没用;-)

你会用这个吗?

我不认为有一个非空返回委托类型是明智的,就像我的例子一样。但是,出于性能原因,您可能考虑使用参数是值类型(结构,而不是类)的委托。使用事件可能不会导致在堆上分配 EventArgs 对象的垃圾回收惩罚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2012-10-04
    • 2019-11-17
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多