《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. 学习笔记之Model selection and evaluation

    学习笔记之scikit-learn - 浩然119 - 博客园 https://www.cnblogs.com/pegasus923/p/9997485.html 3. Model selection ...

  2. 20165312 2017-2018-2《Java程序设计》课程总结

    20165312 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我期望的师生关系 预备作业2:C语言基础调查和java学习展望 预备作业3:Linux安 ...

  3. JavaWeb——java.lang.UnsatisfiedLinkError

    java.lang.UnsatisfiedLinkError: Native Library sqlite-3.8.6-amd64-sqlitejdbc.dll already loaded in a ...

  4. python中赋值,深拷贝,浅拷贝区别

    这三种 的区别就是 复制的变量 是否是原变量的引用. 赋值:只是原变量的引用. 浅拷贝和深拷贝的区别 需要通过 子元素 区分 浅拷贝:子元素的 引用相同 深拷贝:所以引用都不相同,完全复制一份 这三种 ...

  5. 2008nian元旦

    我要做---->> 控制财务状况---1记账 2 炒股或基金 3预算 锻炼---每次要达到锻炼的效果 学习计划-- 1报班架构 2 项目管理 3读书 爱好---做饭,收拾整理 职业规划. ...

  6. python3 re.compile中含有变量

    id = '7F' reg = re.compile(id + '[^\dA-F]?\d') line = ‘122s 7f 3' match = reg.search(line) 在程序中有时候会遇 ...

  7. kudu导入文件(基于impala)

    kudu是cloudera开源的运行在hadoop平台上的列式存储系统,拥有Hadoop生态系统应用的常见技术特性,运行在一般的商用硬件上,支持水平扩展,高可用,集成impala后,支持标准sql语句 ...

  8. centos7下 nginx配置upstream 不能直接代理到本机tomcat的解决

    Nginx代理本地tomcat时404. upstream是直接配置server localhost:10000 的.单独访问tomcat是可以的. 查看/var/log/nginx/error.lo ...

  9. SqlServer中的UNION操作符在合并数据时去重的原理以及UNION运算符查询结果默认排序的问题

    本文出处:http://www.cnblogs.com/wy123/p/7884986.html 周围又有人在讨论UNION和UNION ALL,对于UNION和UNION ALL,网上说的最多的就是 ...

  10. Hibernate 再接触 总结