活动和代表

时间:2012-05-17 23:16:22

标签: c# events delegates

Button.Click += new RoutedEventHandler(_click);

private void _click(object sender EventArgs e) 
{
   //... 
} 

在上面的代码中,我们使用Button.Click事件实例化RoutedEventHandler类型,它是一个委托。但事件本身就是一个抽象的代表,不是吗?我不明白它与仅将RoutedEventHandler实例化为变量,然后将变量添加到实例的调用列表之间的区别。我这太难了吗?这里涉及的所有代表如何运作?

编辑:所以我主要关注的是试图弥合我对代表的了解与我对事件的了解之间的差距。我知道一个事件是一个包含在另一个抽象层中的委托。因此,当您使用+ =运算符将另一个委托分配给其调用列表时,您只是将委托分配给另一个委托,对吗?但是在我上面编写的代码中,你实际上并没有实例化RoutedEventHandler类,所以我对你如何将它实际传递到Button.Click事件的调用列表感到困惑。我也感到困惑,因为看起来所有东西实际上都指向委托和事件的其他东西,并且引用变得复杂。

3 个答案:

答案 0 :(得分:1)

您可以将事件视为代理的集合的包装(具有添加/删除成员的一些语法糖)。事件处理组播对多个委托的调用,您可以添加自定义逻辑以允许(或不允许)添加委托(与在属性中包装字段并在属性的getter / setter上添加一些逻辑的方式相同) )。让一个类中的事件向全世界“广告”他们可以安全地添加处理程序(实现为委托)来接收所述事件 - 并允许诸如与Visual Studio等IDE之类的设计时集成。

答案 1 :(得分:1)

当您在事件的上下文中使用委托时,编译器将为委托生成提供支持字段,并为订阅者生成添加/删除公共属性以附加到事件。您可以将委托作为事件使用,但是您将无法将订阅者限制为+ =和 - =

private EventHandler _backingDelegate;
public event EventHandler Click {
   add {
         _backingDelegate += value;
   } 
   remove {
         _backingDelegate -= value;
   }
}

答案 2 :(得分:1)

这个答案可能会对你有所帮助。他已经详细解释了这个问题: -

Events