吴佳鑫的个人专栏

当日事当日毕,没有任何借口

导航

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) );


 

posted on 2012-01-19 15:20  _eagle  阅读(2828)  评论(1编辑  收藏  举报