18

在创建事件时,C# 中的常见做法是按如下方式定义它,取自.NET Framework 指南中的示例

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;

我想知道是否有任何理由要遵循“传统”模式。也许这样的事件表明存在设计缺陷?然而,我使用的理由ActionYAGNI,为什么在不使用时实现某些东西(甚至显示意图)?

4

3 回答 3

17

这不是一个要求,只是一个设计指南。

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

于 2013-09-08T19:18:05.880 回答
9

因为您可以编写一个通用事件处理程序并将其用于许多不同类型的事件(如日志工具),从而利用委托 中的逆变性。

这是一个来自 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 的其余部分保持一致,从而帮助很多将使用您的类的人。

于 2013-09-08T19:16:38.270 回答
0

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

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

于 2013-09-08T19:25:23.057 回答