delegate详解
我们使用delegate关键字定义一个委托数据类型时,其实是定义了一个新类,此类派生自 MulticastDelegate,而 MulticastDelegate 又派生自 Delegate.
我们定义:public delegate int MathOptDelegate(int value1 , int value2);
C#编译器实际上是按照以下这个 “代码模板”进行编译的:
public class MathOptDelegate : System.MulticastDelegate
{
public MathOptDelegate(Object target , Int32 methodPtr);
public void virtual Invoke(Int32 value1 , Int32 value2);
public virtual IAsyncResult BeginInvoke(
Int32 value1 , Int32 value2 , AsyncCallback callback , Object object);
publlic virtual void EndInvoke(IAsyncResult result);
}
注意MathOptDelegate 类的构造函数,它接收两个参数target 和 methodPtr.
1、target:引用要调用方法的对象。
2、methodPtr:是一个方法指针,代表要调用的对象方法。
如果到VS文档中去查看一下Delegete类(是MathOptDelegate类的基类),可以看到它拥有两个公有属性:Target 和 Method ,
这两个属性的值就是由MathOptDelegate 构造函数的这两个参数传入的。
外界对象实例方法的调用通过 MathOptDelegete对象的 Invoke方法实现,而 BeginInvoke和EndInvoke 方法用于实现异步调用。(请参见下一个日记)
二、泛型委托
示例:
public delegate T MyGenericDelegate<T>(T obj);
以下代码定义了一个普通的方法:
static int MyFunc(int value){....}
现在可以定义一个泛型委托MyGenericDelegate<T>变量,它引用MyFunc(int value)方法,注意泛型参数T现在被指定为int:
MyGenericDelegate<int> del = MyFunc;
以下代码通过委托变量“间接”地调用MyFunc(int value)方法:
console.WriteLine( del(100) );