一、前言

翻回之前写的博客,前期写的结构确实差很多,

这次细看了《委托那些事(一)、(二)》,忍不住重新写一下,之前把简单的事情复杂化了。

为什么现在思维不一样了,有一点我认为是见识的计算机语言多了,会比较语法:为什么它要这么设计。

二、委托的本质

首先有一点,万物皆对象,方法也是对象

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 委托的本质:方法对象的应用的更多相关文章

  1. Java编程思想读书笔记(一)【对象导论】

    2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...

  2. 《Java编程思想》笔记 第十一章 持有对象

    1.保存对象引用 1.数组,数组具有固定大小 2.容器类,可自动调节大小 2.容器类 List  Set  Queue  Map 及常用的实现类 2.1 Collection (接口) 保存独立的元素 ...

  3. java编程思想(2)--一切都是对象

    1创建对象 String s ;创建引用,并未初始化,即引用未关联任何东西 String s2="asda"; 初始化 System.out.println(s2); System ...

  4. Java编程思想(二)一切都是对象

    2.1用句柄操纵对象 尽管一切都看作是对象,但是操纵的标识符实际上是指向一个对象的“句柄”(handdle): 拥有一个句柄并不表示必须有一个对象同他连接: String  s:   这里创建的只是句 ...

  5. Java编程思想(2)之一切皆对象

  6. C# 委托、匿名方法、lambda简介

    在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个First不 ...

  7. Java编程思想——初始化与清理

    PS:最近一直忙于项目开发..所以一直没有写博客..趁着空闲期间来一发.. 学习内容: 1.初始化 2.清理 1.初始化   虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...

  8. java编程思想笔记(1)

    java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...

  9. iOS 开发之使用链式编程思想实现简单的计算器

    链式编程思想是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好.例如 a(1).b(2).c(3). 链式编程思想最为关键的是,方法的返回值是block,block必须返回对 ...

  10. C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质

    前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...

随机推荐

  1. web应用模式、API接口、接口测试工具postman、restful规范

    目录 一.web 应用模式 二.API接口 API概念 三.接口测试工具postman postman介绍 postman下载与使用 四.如何在浏览器中测试 五.restful规范(重要,不难) 概念 ...

  2. 【Web前端】【开源分享】H5登陆界面 - 2021年12月30日

    下载地址 Gitee下载 后续更新关注本文评论区作者萌狼蓝天的回复

  3. IDEA和GIT关于文件中LF和CRLF问题

    问题描述:项目软件安装shell脚本上git仓库管理,但拉取后,上linux运行报错. 问题思考:根据描述信息可以查看到\r字样,初步判别为换行符导致 1.将脚本文件移动至notepad++中,通过视 ...

  4. UML之模型、包及包的版型(构造型)

    包是UML模型的组织结构,也是UML项目的配置管理结构.包存在多个层级,除了顶层包,所有包隶属于一个且仅隶属于一个上层包.在项目不同阶段实际推进与配置过程中,通常以不同层级的包为单位进行check-i ...

  5. [转]OpenCV_Find Basis F-Matrix and computeCorrespondEpilines(获取一对图像的基础矩阵及对应极线)

    代码如下: // BasisMatrixCalculate.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <ios ...

  6. 大模型复现实践记录-在linux环境4090GPU(24G)

    chatglm-6b chatglm2-6b tigerbot-7b baichuan-7b vicuna

  7. HVV面试

    linux日志管理 1. 检查系统帐号安全(1) /etc/passwd(2) /etc/shadow(3) 特权用户(uid==0)awk -F: '$3==0{print $1}' /etc/pa ...

  8. Solution -「ZJOI 2010」「洛谷 P2570」贪吃的老鼠

    \(\mathscr{Description}\)   Link.   有 \(n\) 块奶酪,每块奶酪出现时段为 \([s_i,t_i]\),体积为 \(V_i\):有 \(m\) 只老鼠要吃奶酪, ...

  9. Java AQS学习笔记

    1. AQS介绍 AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面. AQS是一个用来构建锁和同步器的框架,使 ...

  10. kubernetes 使用ceph实现动态持久卷存储

    k8s使用ceph存储 ceph提供底层存储功能,cephfs方式支持k8s的pv的3种访问模式​​ReadWriteOnce,ReadOnlyMany ,ReadWriteMany​​​ ,RBD支 ...