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#编译器实际上是按照以下这个 “代码模板”进行编译的:
注意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) );
我们使用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) );
相关文章推荐
- C#例题3-1简单的程序
- Java并发编程:深入剖析ThreadLocal
- iOS -iPhone5、iPhone5s、iPhone6、iPhone6Plus 屏幕适配
- 我对管理信息系统定位的理解
- 像素格式的定义
- 数据结构实践——集合合并
- 数据挖掘十大经典算法之:决策树C4.5 分类算法
- 使用 CXF 写 一个简单的webservice demo
- MongoDB 的安装和使用
- 分享一个连接
- log4j配置
- 修改苹果自带地图中的路线颜色
- java.io.IOException: Invalid header signature; read 0xE011BDBFEFBDBFEF, expected 0xE11AB1A1E011CFD0
- Hibernate(五)——一对多单向关联映射
- 第三周 顺序表的应用(1)
- QQ群问问开始对外公测
- 第三周项目2-建设“顺序表”算法库
- Hibernate(六)——多对多关联映射
- 委托使用示例
- 实数gcd,大数快速乘与组合数取模