就是对C#中delegate的用法不是很清楚,是不是类似于C++中的函数指针
给你说一个实例,比如查询一个数据量大约百万的数据表,在查询的过程中界面是会呈现“假死”,也就是卡死的状态,直到返回查询结果才恢复。
这时,通常会使用多线程 Thread 来新建一个线程去执行这条语句,这样主界面所在的主线程不会受影响,也就不会出现界面卡死的情况。
说了这么多还没说到deleate,也就是委托。如果子线程在执行的过程中,想要调用主线程所创建的控件(也就是界面控件),就会报错,这时就会用到委托。利用委托让子线程调用主线程的控件。
我个人的理解,delegate就是用来实现Invoke调用的。就是跨线程调用。比如在线程中调用WinForm的方法,对WinForm组件进行操作之类的。
就是类似函数指针,换了一种申明,调用方法
public delegate void DelegateMethod();
这就申明了一个类型,然后就可以用它去接收同类型的函数指针
Delegate和C++中函数指针的区别
Delegate和C++中的函数指针很像,但如果深入对比,发现其实还是有区别的,区别主要有三个方面(参考Stanley B. Lippman的一篇文章)
1) 一个 delegate对象一次可以搭载多个方法(methods),而不是一次一个。当我们唤起一个搭载了多个方法(methods)的delegate,所有方法以其“被搭载到delegate对象的顺序”被依次唤起。
2) 一个delegate对象所搭载的方法(methods)并不需要属于同一个类别。一个delegate对象所搭载的所有方法(methods)必须具有相同的原型和形式。然而,这些方法(methods)可以即有static也有non-static,可以由一个或多个不同类别的成员组成。
3) 一个delegate type的声明在本质上是创建了一个新的subtype instance,该 subtype 派生自 .NET library framework 的 abstract base classes Delegate 或 MulticastDelegate,它们提供一组public methods用以询访delegate对象或其搭载的方法(methods) ,与函数指针不同,委托是面向对象、类型安全并且安全的。
个人感觉代理主要用于多线程,最直观的就是winform程序进度条
委托就是c++中的函数指针。
委托是放置方法的容器,可以通过委托来调用特定方法而无需知道具体方法的名称。
比如开发界面上的按钮button, 可以为onclick事件申明一个委托,一旦发生点击事件便出发委托里所放的函数。但是这个放置在委托中的函数可以随意改变,button类确无需进一步修改了。
最后以一个老段子来解释委托:
你好我是 王先生 (一个对象 王先生)
我可以帮你写程序 (类似对象的成员方法,叫编程)
我的联系方式是 (类似呼叫王先生的委托)
有事请给我打电话。(类似通过委托来呼叫对象成员方法)
C#是强类型语言,所有数据都有类型,delegate就是"方法类型",其实就是函数指针啦。
先来简单地看看int类型的数据(变量)怎么使用:
先定义一个类型 int,然后给一个名字number当做变量名,最后赋值一个1给它,那么这个number变量就可以供我们使用了
int number = 1;
用来保存方法的返回值:
number = add(10,20);
或者传到函数里面:
var result = add(number,20);
那么方法呢? 我们想用一个变量来保存"方法"和把"方法"当做参数传到另外一个方法里面该怎么做?
int Add(int a,int b){
return a + b;
}
加法函数类型 addFunc = Add //把Add函数地址的指针指向addFunc变量(其实就是赋值)
同样也是先定义类型 "加法函数类型" 然后给一个名字addFunc当做变量名,最后赋值一个add()方法给它,那么我们就可以把方法存到一个变量里面了,当然也就意味着可以传参了。
但"加法函数类型" 这个类型C#里面是没有的,这个时候delegate关键字就派上用场了。
delegate int 加法函数类型(int a,int b);
这样就定义好"加法函数类型"了
delegate int 加法函数类型(int a,int b);
加法函数类型 addFunc = (a,b)=> a + b;
int Todo(加法函数类型 func ){
int a = 20;
int b = 30;
int c = func(a,b);
return c * 100;
}
var result = Todo(addFunc);
了解C\C++里面的函数指针就应该很容易就能理解C#里面的"委托"。 而且,委托是类型安全的。