【编程思想】C# delegate 委托的本质:方法对象的应用
一、前言
翻回之前写的博客,前期写的结构确实差很多,
这次细看了《委托那些事(一)、(二)》,忍不住重新写一下,之前把简单的事情复杂化了。
为什么现在思维不一样了,有一点我认为是见识的计算机语言多了,会比较语法:为什么它要这么设计。
二、委托的本质
首先有一点,万物皆对象,方法也是对象。
C# 方法的类型是: Func(执行有返回参数)或者 Action(执行无返回)。
委托(delegate)
就是语法,包装这么一个事情:
当需要实现执行对象A的a方法时,就触发执行方法b、c、d..,并且方法b、c、d..可以按需定义。
注:delegate关键词的用法,见链接
这个关键词存在就是增加语法复杂度,C#语法糖升级,可以使用类型Func或Action,这比delegate更清爽。
事件(event)
方法b、c、d..的容器,可以往里放方法对象,也可以拿出来。
订阅(event += 方法)
往方法容器(event)里面放入方法对象,这个动作叫做订阅。event 类型支持 += 方法 的用法。
退订/取消订阅(event -= 方法)
往方法容器(event)里面移出方法对象,这个动作是取消订阅,也即退订。event 类型支持 -= 方法 的用法。
三、示例代码
public delegate void OrderEventHandler(Customer cus, OrderEventArgs e); // 后缀EventHandler 是习惯命名 public class OrderEventArgs : EventArgs // 习惯把xxEventArgs 继承于C#自带的EventArgs { public string DishName { get; set;} public string Size { get; set;} } public class Customer { private OrderEventHandler orderEventHandler; public event OrderEventHandler Order { // 容器只接受OrderEventHandler 的方法签名 add { this.orderEventHandler += value;} // 和get、set一样的,换了个名字 remove { this.orderEventHandler -= value;} } public void ThinkForOrder () // 顾客下单 { if (this.orderEventHandler != null ) // 容器里面存在方法时,就不为空 { // invoke(xxA, xxB) 即执行容器内的所有方法,xxA、xxB类型由OrderEventHandler 指定 this.orderEventHandler.Invoke(this, new orderEventArgs{ 。。}); } } }
遥想起,初学delegate的时候,看代码看得很痛苦,觉得很绕,现在看来……
就这 ?