委托闲谈--杂文

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23018459/article/details/85128767

1委托(delegate) 从字面意思上讲,指把事情托付给别人或者别的机构办理。

2在计算机科学中,委托(delegate)是一种类型安全的函数指针。用于通用语言运行库(CLI)。学过指针的都应该知道,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。而作为函数指针的委托(delegate)应该具有指针属性和功能。函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。

*************************************************************************************************

----类型安全的函数指针----

委托是一个引用类型,所以它具有引用类型所具有的通性。它保存的不是实际值,而是保存对存储在托管堆(managed heap)中的对象的引用。那它保存的是对什么的引用呢?委托保存的是对函数(function)的引用。

对学过C/C++的人,是不是觉得跟函数指针很像呢!委托可以引用实例和静态(在 Visual Basic 中为 Shared)方法,而函数指针只能引用静态方法。 其实它们是有区别的,在非托管C/C++中,函数的地址就是一个内存地址。该地址不会携带任何额外的信息,例如函数期望的参数个数、参数类型、函数的返回值类型及函数的调用约定。总之,非托管C/C++中函数指针是非类型安全的。而.NET中的委托是类型安全的,委托会检测它所保存的函数引用是否和声明的委托匹配。所以说委托是一种类型安全的函数指针。

*************************************************************************************************

在C#中,delegate是一种class,包装了一个或多个函数指针及绑定的类实例。Delegate用来实现函数回调与事件接受(event listener)。Delegate对象可以作为参数传递给其他函数,以引用(referenced) 封装在delegate对象中的函数,而无需在编译时刻就绑定被调用函数。

看一下定义:

委托实际上是一个类,在我们定义委托的时候:
public delegate
void GreetingDelegate(string name);
当编译器遇到这段代码的时候,会生成下面这样一个完整的类:


public sealed
class GreetingDelegate:System.MulticastDelegate{
    public GreetingDelegate(object @object, IntPtr method);
    public virtual IAsyncResult BeginInvoke(string name, AsyncCallback callback,
object @object);
    public virtual
void EndInvoke(IAsyncResult result);
    public virtual
void Invoke(string name);
}

“委托”作为类,继承自System.MulticastDelegate(抽象类)。可以认为包含:一个类对象实例的地址(Target属性),该类的一个方法的地址(Method属性),以及另一个“委托”实例的引用(reference)。因此引用一个“委托”对象,可能实际上引用了多个“委托”的实例。“委托”对象被调用时,依次调用里面的多个“委托”的实例。这对于事件驱动的程序比较有用。

如果“委托”封装了一个静态函数,则其内部的绑定的类对象地址为null。

可以通过Delegate类的GetInvocationList()取出这些委托,并查看其Target和Method属性,获取所引用的方法名等信息。

委托详细应用请浏览-->  委托与事件

猜你喜欢

转载自blog.csdn.net/qq_23018459/article/details/85128767