Delegate 与 Event

转作者信息:

非余的博客




在 .NET 里,Event 实际上是通过 Delegate 实现的。例如通常使用的 EventHandler 就是一个 Delegate 类。但是由于一些代码的封装,例如 += -= 操作符的重写、event 关键字的使用,会增加理解上的难度。

我们在 Windows Form 里所写的 Form_Load、Button_Click 之类函数在本质上是用来回调的。
1. 谁来回调?被调用者。对 Form_Load 来说,是当前派生出的 Form 的基类;对 Button_Click 来说,就是实例化后的 Button 类。
2. 何时回调?当然是由被调用者在处理到需要调用回调函数的时候了。

为什么要使用 += -= 操作符呢?这是因为我们所写的所有 Delegate 都是从 MulticastDelegate 派生出来的,而 MulticastDelegate 意味着在回调时可以通过 Delegate 链连续调用多个符合我们 Delegate 定义的函数。我们可以通过 Delegate.Combine 和 Delegate.Remove 来实现 Delegate 链的管理。示例代码如下:
Worker worker = new Worker();
worker.WorkEventHandler = (Worker.MyEventHandler)Delegate.Combine(worker.WorkEventHandler, new Worker.MyEventHandler(this.CallEventHandler1));
worker.WorkEventHandler = (Worker.MyEventHandler)Delegate.Combine(worker.WorkEventHandler, new Worker.MyEventHandler(this.CallEventHandler2));
这样写的确有些麻烦,所以编译器通过提供 += -= 的重写来简化编码。示例代码如下(实际上等同于上面的代码):
Worker worker = new Worker();
worker.WorkEventHandler += new Worker.MyEventHandler(this.CallEventHandler1);
worker.WorkEventHandler += new Worker.MyEventHandler(this.CallEventHandler2);

至于 event 关键字,实际上不使用它回调功能仍然可以正常工作。使用它的目的主要在于做出标识,供 IDE 和编译器识别。
如果使用 event 来定义 Delegate 的话,在编译时会强制你使用 += -= 操作符来管理 Delegate 链(使用 Combine 或 Remove 会导致编译错误)。示例代码如下:
public delegate void MyEventHandler(object sender, EventArgs e);
public event MyEventHandler WorkEventHandler;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值