关于事件的两个问题

时间:2011-03-23 14:19:28

标签: c# .net events


我想知道:

  1. 订阅者是订阅事件的类的名称,还是处理事件的方法的名称?我的意思是,说“订阅事件的方法”是否有意义?

  2. 在MSDN上,它说事件委托应该有2个参数。不知道这意味着什么,因为我经常使用我的自定义委托创建事件,例如没有或一个论点。

3 个答案:

答案 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类的字段提供合适的默认值,并且只在需要时提供值。

大多数好/坏练习的谈话都集中在一件事 - 易于改变。变化总是发生。你做的事情变得越少越好。设计有很多次迭代,你可能需要经常更改你的接口和类型。每当您决定不再需要参数时,您不希望更改数十个签名。因此,请使用EventArgsEventArgs<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的,那么您可以使用一种通用方法。如果没有,那么你最终会有数十个。

相关问题