您的位置:首页 > 其它

delegate详解

2015-09-21 16:55 423 查看
http://www.cnblogs.com/eagle1986/archive/2012/01/19/2327306.html

我们使用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) );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: