我想知道:
订阅者是订阅事件的类的名称,还是处理事件的方法的名称?我的意思是,说“订阅事件的方法”是否有意义?
在MSDN上,它说事件委托应该有2个参数。不知道这意味着什么,因为我经常使用我的自定义委托创建事件,例如没有或一个论点。
答案 0 :(得分:4)
1)是的,谈论为某个事件订阅方法绝对有意义。您实际上可以想到涉及三个实体:
2)您当然可以 使用具有任意数量参数的代理来创建事件。 约定是事件中使用的委托有两个参数:“发件人”和从EventArgs
派生的“参数”。例如,这意味着您可以按照惯例从签名为void Foo(object sender, EventArgs e)
到任何事件的方法订阅处理程序。
答案 1 :(得分:0)
订阅者是添加为事件处理程序的方法。
标准做法是使用EventHandler<T>
代表进行活动;这有两个论点
但是,您可以使用任意数量的参数创建自己的事件。
答案 2 :(得分:0)
我将专注于第二点。正如乔恩指出的那样,你可以使用你自己的代表来举办活动。但你很少应该。即使您不关心约定,也可以这样看待:每当您将自己的事件与自定义委托一起使用时,除了事件字段本身之外,您还有以下代码:
InvokeMyEvent
方法和其他需要完成的工作如果您决定添加或删除参数或更改参数类型,则必须更改所有这些。
现在,如果您创建自己的继承EventArgs
或使用EventArgs<T>
的类,则可以:
CustomEventArgs
班级InvokeMyEvent
种方法。每当您决定更改事件时,您 只更改自定义args类和事件调用点的某些。 “一些”,因为您可以为args类的字段提供合适的默认值,并且只在需要时提供值。
大多数好/坏练习的谈话都集中在一件事 - 易于改变。变化总是发生。你做的事情变得越少越好。设计有很多次迭代,你可能需要经常更改你的接口和类型。每当您决定不再需要参数时,您不希望更改数十个签名。因此,请使用EventArgs
或EventArgs<T>
,让自己有些头疼。
另一个小问题是,您可能想要声明一些负责引发事件的方法,如下所示:
public static public void FireEvent<T>(this EventHandler handler, object sender, EventArgs<T> e)
where T : EventArgs
{
if (handler != null)
handler(sender, e);
}
如果您的所有活动都是基于EventHandler
的,那么您可以使用一种通用方法。如果没有,那么你最终会有数十个。