我有一个事件,只是让用户知道发生了什么事。他们必须手动为该事件采取行动,因为没有数据从中传递。
但是,我不确定什么会更惯用:
public event Action MyEvent;
//clearly says no arguments
public event EventHandler MyEvent;
//uses the EventHandler class to no effect, but might be more idiomatic.
public event Action<object> MyEvent;
//just like the first but passes the sender if needed.
这是标准的方法吗?
答案 0 :(得分:8)
惯用法是使用EventHandler
。如果您有一个或null
,则传递给相应的发件人,EventArgs.Empty
。
我知道这有点疯狂,但这就是惯例。请记住,普通EventArgs
中没有有用的信息,因此任何基于 EventHandler
的事件基本上都是在说“我可能会收到发件人,但这可能就是全部。”
但是,对于C#2的委托差异,有一个好处:您可以对遵循约定的所有事件使用相同的事件处理方法...所以你可以拥有(说)记录事件处理程序,它使用反射转储它们在EventArgs
中给出的 的任何信息,即使它们在编译时不知道它。
不可否认,这不是世界上最伟大的会议论证 - 但它是一个相当强大的论点。当然,routed events在订阅方式上略有不同,但即使如此,代表也遵循相同的模式。