在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,为什么在不使用时会实现某些内容(甚至显示意图)?
答案 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>
类。