【文件属性】:
文件名称:委托进阶-python3+opencv3识别图片中的物体并截取的方法
文件大小:10.59MB
文件格式:PDF
更新时间:2021-07-10 13:22:16
.net之美 关键技术解析
3.5 委托进阶
掌握了前面的基础知识以后,从本节开始,将为大家更深入地介绍委托的知识。
3.5.1 为什么委托定义的返回值通常都为void
尽管并非必需,但是大家会发现很多的委托定义返回值都为void,为什么呢?这是因为
委托变量可以供多个订阅者注册,如果定义了返回值,那么多个订阅者的方法都会向发布者
返回数值,结果就是后面一个返回的方法值将前面的返回值覆盖掉了,因此,实际上只能获
得最后一个方法调用的返回值。可以运行下面的代码测试一下。除此以外,由于发布者和订
阅者是松耦合的,发布者根本不关心谁订阅了它的事件、为什么要订阅,更不用说订阅者的
返回值了,所以返回订阅者的方法返回值在大多数情况下根本没有必要。
class Program {
static void Main(string[] args) {
Publishser pub = new Publishser();
Subscriber1 sub1 = new Subscriber1();
Subscriber2 sub2 = new Subscriber2();
Subscriber3 sub3 = new Subscriber3();
pub.NumberChanged += new GeneralEventHandler(sub1.OnNumberChanged);
pub.NumberChanged += new GeneralEventHandler(sub2.OnNumberChanged);
pub.NumberChanged += new GeneralEventHandler(sub3.OnNumberChanged);
pub.DoSomething(); // 触发事件
}
}
// 定义委托
public delegate string GeneralEventHandler();
// 定义事件发布者
public class Publishser {
public event GeneralEventHandler NumberChanged; // 声明一个事件
public void DoSomething() {
if (NumberChanged != null) { // 触发事件
string rtn = NumberChanged();
Console.WriteLine(rtn); // 打印返回的字符串,输出为Subscriber3
}
}
}
// 定义事件订阅者
public class Subscriber1 {
public string OnNumberChanged() {
return "Subscriber1";