C#委托Delegate

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取代对委托的使用;

猜你喜欢

转载自blog.csdn.net/noEnoughChief/article/details/79128319