-
【C#进阶】委托的本质:方法对象的应用
一、前言
翻回之前写的博客,前期写的结构确实差很多,
这次细看了《委托那些事(一)、(二)》,忍不住重新写一下,之前把简单的事情复杂化了。
为什么现在思维不一样了,有一点我认为是见识的计算机语言多了,会比较语法:为什么它要这么设计。
二、委托的本质
首先有一点,万物皆对象,方法也是对象。
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的时候,看代码看得很痛苦,觉得很绕,现在看来……
就这 ?
出处:https://www.cnblogs.com/carmen-019/p/17051091.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数