《C#从现象到本质》读书笔记(六)第8章委托和事件
《C#从现象到本质》读书笔记(六)第二部分 C#特性 第8章委托和事件
从这一部分开始,知识点就相对少了,重要的是代码练习。奈何太高深的代码平常不怎么用,这些特性也不是经常写代码的。
委托是事件的基础。
委托不是类型的成员之一,但事件是。委托是一个密封类,可以看成是一个函数指针,它可以随情况变化为相同签名的不同函数。
方法的签名必须和委托一致,方法签名包括参数的个数、类型和顺序;方法的返回类型要和委托一致,注意,方法的返回类型不属于方法签名的一部分。
使用委托分为三步:1)定义委托。2)创建委托的一个实例,并指向一个合格的方法(其输入、输出和委托本身相同)。3)同步或异步调用方法。
委托有三大作用:代码复用、异步调用和作为回调(即事件的基础)。
- public enum Operator
- {
- Add,Subtract,Multiply,Divide
- }
- class Program
- {
- public delegate double CalculateDelegate(double a, double b);//1.定义
- static void Main(string[] args)
- {
- double a = ;
- double b = ;
- Console.WriteLine("Result:{0}",Calculate(a,b,Add));//3.调用
- Console.ReadKey();
- }
- public static double Calculate(double a, double b, CalculateDelegate cd)
- {
- //2.指向
- return cd.Invoke(a, b);
- }
- public static double Calculate(double a, double b, Operator o)
- {
- switch (o)
- {
- case Operator.Add:
- return Add(a, b);
- case Operator.Subtract:
- return Subtract(a, b);
- case Operator.Multiply:
- return Multiply(a, b);
- case Operator.Divide:
- return Divide(a, b);
- default:
- return ;
- }
- }
- public static double Add(double a, double b)
- {
- return a + b;
- }
- public static double Subtract(double a, double b)
- {
- return a - b;
- }
- public static double Multiply(double a, double b)
- {
- return a * b;
- }
- public static double Divide(double a, double b)
- {
- if(b==) throw new DivideByZeroException();
- return a / b;
- }
- }
方法本身也可以看成是一种特殊类型的变量。
协变和逆变都是针对引用类型的。
Invoke方法赋予其同步访问的能力,BeginInvoke、EndInvoke赋予其异步访问的能力。
委托时类型安全的。
如果委托链中含有很多委托,只会收到最后一个含有返回值的委托的返回值。假如这个委托方法是由输出值的,而且想令委托链上的下一个方法的输入等于上一个方法的输出值,只能通过GetInvocationList方法得到委托链上的所有方法,然后一一执行。
事件必须包括三部分:
1)事件的订阅者(subscriber)。2)事件的触发者,或者发布者(publisher)。
3)订阅者和触发者之间的数据传送通道。
使用事件的步骤需要:
1)声明一个事件处理方法,指出事件发生时订阅者应该有怎样的反应。
2)声明委托。委托的签名和事件的处理方法相同。
3)声明基于该委托的事件。
4)为事件增加订阅者。
5)在事件符合条件时,调用事件。
之后会慢慢补充这部分用到的一些代码。
《C#从现象到本质》读书笔记(六)第8章委托和事件的更多相关文章
- 《Android开发艺术探索》读书笔记 (3) 第3章 View的事件体系
本节和<Android群英传>中的第五章Scroll分析有关系,建议先阅读该章的总结 第3章 View的事件体系 3.1 View基本知识 (1)view的层次结构:ViewGroup也是 ...
- 《深入理解java虚拟机》读书笔记六——第七章
第七章 虚拟机类加载机制 1.类加载的时机 虚拟机的类加载机制: 虚拟机把描述类的数据从class文件中加载到内存,并对数据进行校验.转换解析和初始化,最终形成了可以被虚拟机直接使用的Java类型,这 ...
- C#图解教程读书笔记(第15章 委托)
委托是C#的一个很重要的知识点. 1.什么是委托 委托在我认为,就是一系列格式相同的方法列表,可能就是定义的名称不一致,参数.返回值等都是一样的. 2.如何声明委托 delegate void MyF ...
- SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)
SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1 ...
- 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化
第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...
- 《Linux内核设计与实现》读书笔记——第一、 二章
<Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...
- 《Android开发艺术探索》读书笔记 (9) 第9章 四大组件的工作过程
第9章 四大组件的工作过程 9.1 四大组件的运行状态 (1)四大组件中只有BroadcastReceiver既可以在AndroidManifest文件中注册,也可以在代码中注册,其他三个组件都必须在 ...
- Android驱动开发读书笔记六
第六章 Linux 驱动的工作和访问方式是 Linux 的亮点之一,Linux 系统将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中,由于大多数Linux驱动都有与 ...
- R语言实战读书笔记(六)基本图形
#安装vcd包,数据集在vcd包中 library(vcd) counts <- table(Arthritis$Improved)counts # 垂直barplot(counts, main ...
随机推荐
- CentOS 7安装php
我们已经在上一篇里安装上了nginx:现在我们想要php(也许还包括mysql). (CentOS 7里使用mariadb替代了mysql) # yum install mariadb-client ...
- 【剑指offer】求一组数据中最小的K个数
题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *知识点:Java PriorityQueue 调整新插入元素 转自h ...
- DokuWiki 插件使用
本身DokuWiki提供了一些公共,但是不是很强大,所以可以安装一些插件. 安装方法可以参考:https://www.dokuwiki.org/extensions 下面列举出我觉得好用的一些插件: ...
- .net core 中间件实战
1.新建一个ASP.NET Core Web Application项目,选择空模板. 2.新建一个类RequestIPMiddleware.cs using Microsoft.AspNetCore ...
- IDEA2016 maven项目配置Junit
添加插件:File->Settings->Plugins 设置生成模式:File->Settings->Other Settings 修改模板:File->Setting ...
- MySQL 存储修改
真的坑.
- 61.纯 CSS 创作一只咖啡壶(这个不好看)
原文地址:https://segmentfault.com/a/1190000015376202 感想: 好像不像呀,啊啊啊.伪元素.定位.动画.width和height包括内边距|边框|内容区. H ...
- C# Excel添加超链接
操作当前单元格(关键代码就两行) Range range = (Range)ExSheet.Cells[i + 2, j + 1]; ...
- oracle查看被锁的表和解锁
--以下几个为相关表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * FROM v$proce ...
- docker-compose学习
该实践是在已经安装了docker的基础上,如果还未安装docker,请先安装docker : https://www.cnblogs.com/theRhyme/p/9813019.html docke ...