《C#从现象到本质》读书笔记(六)第二部分 C#特性 第8章委托和事件

从这一部分开始,知识点就相对少了,重要的是代码练习。奈何太高深的代码平常不怎么用,这些特性也不是经常写代码的。

委托是事件的基础。

委托不是类型的成员之一,但事件是。委托是一个密封类,可以看成是一个函数指针,它可以随情况变化为相同签名的不同函数。

方法的签名必须和委托一致,方法签名包括参数的个数、类型和顺序;方法的返回类型要和委托一致,注意,方法的返回类型不属于方法签名的一部分。

使用委托分为三步:1)定义委托。2)创建委托的一个实例,并指向一个合格的方法(其输入、输出和委托本身相同)。3)同步或异步调用方法。

委托有三大作用:代码复用、异步调用和作为回调(即事件的基础)。

  1. public enum Operator
  2. {
  3. Add,Subtract,Multiply,Divide
  4. }
  5.  
  6. class Program
  7. {
  8. public delegate double CalculateDelegate(double a, double b);//1.定义
  9. static void Main(string[] args)
  10. {
  11. double a = ;
  12. double b = ;
  13. Console.WriteLine("Result:{0}",Calculate(a,b,Add));//3.调用
  14. Console.ReadKey();
  15. }
  16.  
  17. public static double Calculate(double a, double b, CalculateDelegate cd)
  18. {
  19. //2.指向
  20. return cd.Invoke(a, b);
  21. }
  22. public static double Calculate(double a, double b, Operator o)
  23. {
  24. switch (o)
  25. {
  26. case Operator.Add:
  27. return Add(a, b);
  28. case Operator.Subtract:
  29. return Subtract(a, b);
  30. case Operator.Multiply:
  31. return Multiply(a, b);
  32. case Operator.Divide:
  33. return Divide(a, b);
  34. default:
  35. return ;
  36. }
  37. }
  38.  
  39. public static double Add(double a, double b)
  40. {
  41. return a + b;
  42. }
  43. public static double Subtract(double a, double b)
  44. {
  45. return a - b;
  46. }
  47. public static double Multiply(double a, double b)
  48. {
  49. return a * b;
  50. }
  51. public static double Divide(double a, double b)
  52. {
  53. if(b==) throw new DivideByZeroException();
  54. return a / b;
  55. }
  56. }

方法本身也可以看成是一种特殊类型的变量。

协变和逆变都是针对引用类型的。

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. CentOS 7安装php

    我们已经在上一篇里安装上了nginx:现在我们想要php(也许还包括mysql). (CentOS 7里使用mariadb替代了mysql) # yum install mariadb-client ...

  2. 【剑指offer】求一组数据中最小的K个数

    题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *知识点:Java PriorityQueue 调整新插入元素 转自h ...

  3. DokuWiki 插件使用

    本身DokuWiki提供了一些公共,但是不是很强大,所以可以安装一些插件. 安装方法可以参考:https://www.dokuwiki.org/extensions 下面列举出我觉得好用的一些插件: ...

  4. .net core 中间件实战

    1.新建一个ASP.NET Core Web Application项目,选择空模板. 2.新建一个类RequestIPMiddleware.cs using Microsoft.AspNetCore ...

  5. IDEA2016 maven项目配置Junit

    添加插件:File->Settings->Plugins 设置生成模式:File->Settings->Other Settings 修改模板:File->Setting ...

  6. MySQL 存储修改

    真的坑.

  7. 61.纯 CSS 创作一只咖啡壶(这个不好看)

    原文地址:https://segmentfault.com/a/1190000015376202 感想: 好像不像呀,啊啊啊.伪元素.定位.动画.width和height包括内边距|边框|内容区. H ...

  8. C# Excel添加超链接

    操作当前单元格(关键代码就两行) Range range = (Range)ExSheet.Cells[i + 2, j + 1];                                   ...

  9. oracle查看被锁的表和解锁

    --以下几个为相关表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * FROM v$proce ...

  10. docker-compose学习

    该实践是在已经安装了docker的基础上,如果还未安装docker,请先安装docker : https://www.cnblogs.com/theRhyme/p/9813019.html docke ...