《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章委托和事件的更多相关文章

  1. 《Android开发艺术探索》读书笔记 (3) 第3章 View的事件体系

    本节和<Android群英传>中的第五章Scroll分析有关系,建议先阅读该章的总结 第3章 View的事件体系 3.1 View基本知识 (1)view的层次结构:ViewGroup也是 ...

  2. 《深入理解java虚拟机》读书笔记六——第七章

    第七章 虚拟机类加载机制 1.类加载的时机 虚拟机的类加载机制: 虚拟机把描述类的数据从class文件中加载到内存,并对数据进行校验.转换解析和初始化,最终形成了可以被虚拟机直接使用的Java类型,这 ...

  3. C#图解教程读书笔记(第15章 委托)

    委托是C#的一个很重要的知识点. 1.什么是委托 委托在我认为,就是一系列格式相同的方法列表,可能就是定义的名称不一致,参数.返回值等都是一样的. 2.如何声明委托 delegate void MyF ...

  4. SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)

    SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1 ...

  5. 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

    第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...

  6. 《Linux内核设计与实现》读书笔记——第一、 二章

    <Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...

  7. 《Android开发艺术探索》读书笔记 (9) 第9章 四大组件的工作过程

    第9章 四大组件的工作过程 9.1 四大组件的运行状态 (1)四大组件中只有BroadcastReceiver既可以在AndroidManifest文件中注册,也可以在代码中注册,其他三个组件都必须在 ...

  8. Android驱动开发读书笔记六

    第六章 Linux 驱动的工作和访问方式是 Linux 的亮点之一,Linux 系统将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中,由于大多数Linux驱动都有与 ...

  9. R语言实战读书笔记(六)基本图形

    #安装vcd包,数据集在vcd包中 library(vcd) counts <- table(Arthritis$Improved)counts # 垂直barplot(counts, main ...

随机推荐

  1. PHP 获取数组是几维数组

    // 判断数组是几维数组$data = array(); // 是你要判断的数组$al = array(0);function aL($data,&$al,$level=0){ if(is_a ...

  2. centos7如何安装部署Zabbix

    参考http://www.cnblogs.com/momoshouhu/p/8041293.html 1.关闭selinux和firewall 1.1检测selinux是否关闭 [root@local ...

  3. [UE4]Safe Zone:安全区域

    一.在做移动开发的时候,为了避免被手机上的硬件元素挡住界面,就可以使用Safe Zone控件,如下图所示的棕色区域就是Apple IphoneX的课被挡住界面的区域:上面的是Iphone的喇叭位置,下 ...

  4. 备份与还原mysql 数据库的常用命令。

    一.备份数据: Mysqldump常用命令: mysqldump -u用户名 -p密码 --databases 数据库1 数据库2 > xxx.sql 常见选项: -u: 用户名 -p: 密码 ...

  5. 3、zookeeper 集群模式搭建

    服务器 1:192.168.1.81  端口:2181.2881.3881 服务器 2:192.168.1.82  端口:2182.2882.3882 服务器 3:192.168.1.83  端口:2 ...

  6. centos7安装elasticsearch6.3.x集群并破解安装x-pack

    一.环境信息及安装前准备 主机角色(内存不要小于1G): 软件及版本(百度网盘链接地址和密码:链接: https://pan.baidu.com/s/17bYc8MRw54GWCQCXR6pKjg 提 ...

  7. python——eval()函数

    eval()函数用来执行一个字符串表达式,并返回表达式的值. 语法:eval(expression[, globals[, locals]]) x = 4 print(eval('3 * x'))12 ...

  8. Windows操作系统的版本

    Windows操作系统的版本号一览 操作系统 PlatformID 主版本号 副版本号 Windows95 1 4 0 Windows98 1 4 10 WindowsMe 1 4 90 Window ...

  9. RestExpress response中addHeader 导致stackOverflow

    问题描述: 最近在项目使用中要在restExpress的header中增加一个键值对,同事在使用的时候没有对header的value进行非空判断,于是在测试环境测试的时候就出现了一个异常

  10. leetcode85

    class Solution { public int maximalRectangle(char[][] matrix) { if(matrix == null || matrix.length = ...