delegate详解



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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值