【编程思想】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的时候,看代码看得很痛苦,觉得很绕,现在看来……
就这 ?
【编程思想】C# delegate 委托的本质:方法对象的应用的更多相关文章
- Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
- 《Java编程思想》笔记 第十一章 持有对象
1.保存对象引用 1.数组,数组具有固定大小 2.容器类,可自动调节大小 2.容器类 List Set Queue Map 及常用的实现类 2.1 Collection (接口) 保存独立的元素 ...
- java编程思想(2)--一切都是对象
1创建对象 String s ;创建引用,并未初始化,即引用未关联任何东西 String s2="asda"; 初始化 System.out.println(s2); System ...
- Java编程思想(二)一切都是对象
2.1用句柄操纵对象 尽管一切都看作是对象,但是操纵的标识符实际上是指向一个对象的“句柄”(handdle): 拥有一个句柄并不表示必须有一个对象同他连接: String s: 这里创建的只是句 ...
- Java编程思想(2)之一切皆对象
- C# 委托、匿名方法、lambda简介
在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个First不 ...
- Java编程思想——初始化与清理
PS:最近一直忙于项目开发..所以一直没有写博客..趁着空闲期间来一发.. 学习内容: 1.初始化 2.清理 1.初始化 虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...
- java编程思想笔记(1)
java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...
- iOS 开发之使用链式编程思想实现简单的计算器
链式编程思想是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好.例如 a(1).b(2).c(3). 链式编程思想最为关键的是,方法的返回值是block,block必须返回对 ...
- C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...
随机推荐
- Qt开发经验小技巧241-245
QString类是我个人认为Qt所有类中的精华,封装的无可挑剔.内置了各种进制数据的转换,比如将数据转成10进制.16进制显示,或者将10进制.16进制数据转成字符串显示.这里很容易忽略的一点就是,很 ...
- Qt开源作品42-视频监控布局
一.前言 自从做监控系统以来,就一直有打算将这个功能独立出来一个类,这样的话很多系统用到此类布局切换,通用这个类就行,而且后期此布局会增加其他异形布局,甚至按照16:9之类的比例生成布局,之前此功能直 ...
- Linux 下挂载群晖 NAS 硬盘拓展空间(NFS)
在群晖 NAS 上配置 开启 NFS 服务 打开群晖的 设置 - 文件服务 - NFS,把 NFS 服务勾选上,协议选最新即可. 配置文件夹的 NFS 权限 在 设置 - 共享文件夹 下,选择需要开启 ...
- Qt5离线安装包无法下载问题解决办法
1.前言 Qt5离线安装包目前在国内已经被墙了,无法下载,只能下载在线安装包: 直接访问会显示Download from your IP address is not allowed: 本文就提出两种 ...
- 利用Navicat向MySQL数据库中批量插入多条记录的方法
利用Navicat向MySQL数据库中批量插入多条记录的方法: 1.执行包含多条记录的SQL脚本 当VALUES后面的值与表中的字段相比,缺少某些字段时,可采用指定相应的字段名的方式批量插入数据: I ...
- P1437 敲砖块 题解
题意 在一个凹槽中放置了 \(n\) 层砖块.最上面的一层有 \(n\) 块砖,从上到下每层依次减少一块砖.每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示: 14 15 4 3 23 3 ...
- svtools lmerge具体算法
svtools具有不同的子命令以实现不同的功能,其中一个就是lmerge.根据其帮助文档(merge LUMPY calls inside a single file from svtools lso ...
- Diary -「联合省选 2023」鸢尾
零 她们诞生于那样一段迷茫的时期,她们总是一个唱着虚幻的梦呓,一个哼着现实的词曲. 「平行的世界 / 另一个 / 我是怎样的」?如果那时的,虚幻的歌者没有妥协,现在的她会是怎样的人呢? 我 ...
- IoC究竟shift什么?——IoC的基础分析
IoC全称Inversion of Control,直译为控制反转.这是一种设计理念,并非技术. 在明白控制反转之前,应该知道"反转"反的是什么. 被反转的正转 我们从生活中的做饭 ...
- 【刷题】牛客模拟面试 > 模拟面试报告
https://www.nowcoder.com/interview/ai/index 1-TCP协议的流量控制和拥塞控制 TCP的流量控制是基于窗口机制实现的: 在建立连接时, 发送方和接收方都会建 ...