1.委托delegate
是C/C++函数指针的升级版
一切皆地址
变量是某个地址为起点的一段内存中所存储的值。
方法是某个地址为起点的一段内存中所存储的一组机器语言;
直接调用和间接调用
直接调用:通过方法名来调用方法,CPU通过方法名直接获得方法所在地址并开始执行--->返回
间接调用:通过函数指针来调用函数,CPU通过读取函数指针存储的值(函数名地址)获得函数所在地址并开始执行-->返回
Java中没有与委托对应的功能实体
简单使用
1.action委托,没有返回值的方法
或者action();
2.Func委托
Func<int,int,int> <第一个参数int,第二个参数int,返回类型int>
2.委托的声明(自定义委托)
委托是一种类class,也是一种数据类型;
声明方式和一般的类不同,主要为了照顾可读性和C++传统;
public delegate int Calc(int x, int y);
注意声明委托的位置;
要写在命名空间下,因为他也是一种类;
但C#是允许类嵌套的,只是作用域不同了;
委托与所封装的方法必需“类型兼容”;
返回值的数据类型相同,
参数个数和参数类型相同,
参数名可以不同。
3.委托的一般使用
实例:把方法当作参数传给另一个方法
1.模板方法,借用指定的外部方法来产生结果;
2.回调callback方法,调用指定的外部方法
这两种使用方法都是使用委托方法参数,在方法内部进行外部方法的使用。
难精通+易使用+功能强大,不能乱用
1.方法级别的耦合
2.代码可读性下降,debug难度大
3.委托回调,异步、多线程一起使用时候,导致不可维护
4.使用不当会内存泄漏或性能下降
4.委托的高级使用
多播委托multicast
隐式异步调用
----------同步与异步----------
同步:串行,CPU,你做完了我接着做
异步:并行,GPU,两个人同时做(汉语里的同步。。)
----------同步调用和异步调用--------
每一个运行的程序都是一个进程process;
每个进程process有一个或多个线程thread;
同步调用在同一线程内;
异步调用的底层机理是多线程;
串行==同步==单线程 , 并行==异步==多线程;
--------------------------------------------------
同步调用:有直接同步调用(使用方法名直接调用),间接同步调用(使用委托,即单播委托),多播委托也是同步调用。
委托 实现隐式异步调用:使用BeginInvoke()
显示异步调用
定义Thread
C#自带的Tasks
using System.Threading.Tasks;
在实际中,要适当使用接口interface取代对委托的使用;