为什么事件通常使用EventHandler,即使不需要传递参数?

时间:2013-09-08 19:03:26

标签: c# events

在C#中创建事件时,通常的做法是将其定义为from an example in the .NET Framework Guidelines

public class CustomEventArgs : EventArgs
{
    public CustomEventArgs(string s)
    {
        msg = s;
    }
    private string msg;
    public string Message
    {
        get { return msg; }
    } 
}

...

public delegate void CustomEventHandler(object sender, CustomEventArgs a);

通常,我创建的事件根本不需要任何参数。我通常只使用Action来实现这个事件处理程序类型。

public event Action LogonScreenExited;

我想知道为什么人们会想要遵循“传统”模式。也许这样的事件表明设计存在缺陷?我使用Action的原因是YAGNI,为什么在不使用时会实现某些内容(甚至显示意图)?

3 个答案:

答案 0 :(得分:17)

这不是一项要求,仅仅是一本设计指南。

您需要记住,您无法预测客户端代码将如何使用该事件,您无法预测未来。 sender 参数对客户端程序员很有用,它允许他使用单个事件处理程序方法来处理来自多个事件源的事件。从EventArgs派生非常有用,因为它允许您重构事件,从原始基类派生并添加额外的参数,而不会破坏客户端代码。您可以自由地忽略这种方法的好处。

答案 1 :(得分:9)

因为您可以编写通用事件处理程序并将其用于许多不同类型的事件(如日志工具),并在委托中利用contravariance

以下是msdn的一个例子:

// Event hander that accepts a parameter of the EventArgs type. 
private void MultiHandler(object sender, System.EventArgs e)
{
    label1.Text = System.DateTime.Now.ToString();
}

public Form1()
{
    InitializeComponent();

    // You can use a method that has an EventArgs parameter, 
    // although the event expects the KeyEventArgs parameter. 
    this.button1.KeyDown += this.MultiHandler;

    // You can use the same method  
    // for an event that expects the MouseEventArgs parameter. 
    this.button1.MouseClick += this.MultiHandler;

}

除此之外,它只是一个设计指南,推荐方式。接下来它使您的代码可以维护并与.NET的其余部分保持一致,帮助很多将使用您的类。

答案 2 :(得分:0)

您不应该依赖您无权修改其代码的类。 传递从您自己的EventArgs派生类实例化的额外事件arge将允许您在将来传递额外的参数。

此外,您的代码将支持{T}应该从EventArgs类派生的EventHandler<T>类。