image.png

什么是委托?

image.png
什么是指针?
C语言阐述:(图一:直接调用 图二:指针用法)
image.pngimage.png
一切皆地址 √

无论是数据还是算法,皆保存在内存中,变量是寻找数据的地址,函数时寻找算法的地址

直接调用 和 间接调用
直接调用:通过函数名调用函数
间接调用:通过函数指针调用函数

委托的简单使用

Action和Func委托 实例

委托,其实就是函数指针的升级版。完成间接调用。

image.png

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Calculator cal = new Calculator();
  6. Action action = new Action(cal.Report);//Action委托指向cal.Report这个方法
  7. cal.Report();//直接调用
  8. action.Invoke();//间接调用(简便写法:action();)
  9. //Func<in T1,in T2,out TResult> 等价于 Func<参数1,参数2,返回值类型>
  10. Func<int, int,int> func1 = new Func<int, int,int>(cal.Add);
  11. Func<int, int, int> func2 = new Func<int, int, int>(cal.Sub);
  12. int result1 = func1.Invoke(1,2);
  13. int result2 = func2.Invoke(1, 2);
  14. Console.WriteLine(result1);
  15. Console.WriteLine(result2);
  16. //无参数用Action委托;有参数用Func委托
  17. }
  18. }
  19. class Calculator
  20. {
  21. public void Report(){
  22. Console.WriteLine("I have 3 methods");
  23. }
  24. public int Add(int a, int b){
  25. int result = a + b;
  26. return result;
  27. }
  28. public int Sub(int a, int b){
  29. int result = a - b;
  30. return result;
  31. }
  32. }

委托的声明(自定义委托)

image.png
委托是一种类!!!
委托必须和封装的方法保持“类型兼容”!!!

  1. public delegate double Calc(double x, double y);//声明自定义委托类型
  2. class Program{
  3. static void Main(string[] args)
  4. {
  5. Calculator calculator = new Calculator();//创建类实例
  6. Calc cal = new Calc(calculator.Add);//创建自定义委托
  7. cal += calculator.Sub;//给自定义委托 添加 委托方法
  8. cal(100,200);//或者 cal.Invoke(100, 200);
  9. }
  10. }
  11. class Calculator{ //以下的方法类型都兼容(double , double)
  12. public double Add(double a, double b){
  13. Console.WriteLine(a + b);
  14. return a + b;
  15. }
  16. public double Sub(double a, double b){
  17. Console.WriteLine(a - b);
  18. return a - b;
  19. }
  20. }

委托的嵌套类使用:
image.png

委托的使用

委托的一般使用

image.png

模板方法:

优点: ①最大限度地实现代码的重复使用。image.png

image.pngimage.png

回调方法:

image.png
image.png

切勿滥用!!!

老师的反面案例:非常非常乱!

image.png
image.png

委托的高级使用

image.png

多播委托

单播委托 案例

一个委托封装一个方法的形式

1656951926395.png

多播委托 案例

一个委托封装多个方法的形式

1656951905401.png

隐式异步调用

同步 与 异步 的概念:

同步:你做完了我接着做… 异步:咱们两个同时做…

同步调用 与 异步调用 的概念:

①每一个运行的程序是一个进程;每个进程可以由一个或多个线程。 ②同步调用是在同一线程内。即单线程内进行串行调用… image.png ③异步调用的底层机理是多线程。即多线程内进行并行调用… image.pngimage.png

同步调用 与 异步调用

举例案例基础类:image.png

直接同步调用 案例:
image.pngimage.png
间接同步调用 案例:

常用于单播/多播委托…(该处使用多播委托)

image.pngimage.png
隐式异步调用 案例:

常常在使用线程是会形成冲突,我们常常为其“加锁”解决问题。

image.pngimage.png
显式异步调用 案例:
(1)古老原始的方式:
image.pngimage.png

适时使用接口(interface)取代委托的使用

案例如下:

image.png image.png
image.pngimage.png