1
Button.Click += new RoutedEventHandler(_click);

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

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

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

4

3 回答 3

1

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

于 2012-05-17T23:25:14.507 回答
1

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

private EventHandler _backingDelegate;
public event EventHandler Click {
   add {
         _backingDelegate += value;
   } 
   remove {
         _backingDelegate -= value;
   }
}
于 2012-05-17T23:35:54.410 回答
1

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

活动

于 2012-05-19T22:59:39.880 回答