有一段时间我在写异步方法的时候碰到了异步调用同步控件的问题,那时候我找到很多的都是关于委托的相关资料,但是那时候我并不是特别明白。
委托到底是什么?为什么会出现?
这个问题,虽然现在不是很了解,但至少我已经找到了一个理解的办法。
先从定义一个委托出发:
public delegate string Trans(string a)
这是一个委托,它也和方法、函数的定义一样,具有自己的签名,以及返回值声明。如果有读者又不理解的,我希望是回头看看语法书上的说明,这里
就不多阐述。
我们先看一个实例:
public delegate string Name(string str);//定义一个委托,具有一类函数的原型 public string A(string src) { return src+"A"; } public string B(string src) { return src+"B"; } static Main(string[] Args) { Name=A;//用A函数作为实现委托的方法 Console.WriteLine(Name("这是e")); Name=B;//用B函数作为实现委托的方法 Console.WriteLine(Name("这是e")); }
接下来是输出结果:
输出: 这是eA 这是eB
我们来解释一下委托。在解释之前,我们先来谈谈C语言里面的函数指针。
首先,函数与变量一样,是具有内存地址的!我们在调用一个函数的时候,计算机会为每个函数分配一个地址,这个地址存储着形参、变量以及一些声明的内容。
正因为这样,我们可以获取到函数的指针。
比如:
void main() { void (*ptr)(int)=fun; ptr(16); } void fun(int num) { printf("%d\n",num*num); }
输出结果自然为256.
对比一下两者,如果学过C语言的就会明白,委托其实就相当于C语言里面的函数指针,没学过也不要紧(2016.6.11 添加修改)。
只要它代表的是某个返回值、参数类型、参数数目与委托定义的一样的函数(方法)。那么就可以像正常方法一样传递参数,完成调用。这里的调用实际上是调用
用来实现委托的方法,即上面的例子中的A、B函数
(2016.6.11 添加回答)实际上委托只是一个代理,要求是,被委托的函数形参的参数类型(变量类型)与委托一致。;返回值一致
这里附上张子阳先生的博客园,我当初就是在子阳先生的指导下获得一些感悟的。
http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx
子阳先生的实例简直是鬼斧神工,但是本人能力有限,一开始并不能准确的使用委托。后来有了一定的经验积累,慢慢的也开始了解委托的本来面目。
匿名方程的部分放到下次的时候在写吧!