《步步深入委托》——为委托追加多个方法指针的原理
2016-02-04 21:32
183 查看
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。(摘自百度百科的定义)
总结上面的描述:委托就是一个能存放符合某种格式(方法签名)的方法指针的容器。既然委托能添加多个方法的指针,也就是说当我们调用委托的时候就能一次性调用多个方法,当然了,前提条件是我们得将方法的指针放入委托变量中,那么其中的原理是什么哪?
下面我简单总结一下委托的使用。
建一个窗体应用程序,在窗体应用程序里添加一个Button按钮,然后编写下面的代码
编译完成之后,将编译后的 委托.exe放入反编译工具.Net Reflector中,我们看一下为委托追加方法指针编译后的C#代码,图片如下
上面的追加方法的代码经过编译器编译之后的样子如下
小结
为委托追加方法的本质: 是为被追加的方法创建一个新的委托对象,并将方法指针存入对象的父类的父类(Delegate)的IntPtr变量中,然后再将新创建的委托 添加到当前委托对象(dg)的数组中。
总结上面的描述:委托就是一个能存放符合某种格式(方法签名)的方法指针的容器。既然委托能添加多个方法的指针,也就是说当我们调用委托的时候就能一次性调用多个方法,当然了,前提条件是我们得将方法的指针放入委托变量中,那么其中的原理是什么哪?
下面我简单总结一下委托的使用。
建一个窗体应用程序,在窗体应用程序里添加一个Button按钮,然后编写下面的代码
public partial class Form1 : Form { //1、声明委托委托类 public delegate void DGSing(); public delegate void DGSing1(string str); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //2、创建委托对象,并为委托对象添加一个方法指针(方法对象地址) DGSing dg = new DGSing(Sing); //2.1、为委托添加第二个方法指针 dg += Sing1; //2.2、为委托添加第三个方法指针 dg += Sing2; //2.3、为委托移除第三个方法指针 dg -= Sing2; //3、调用委托 dg(); } void Sing() { MessageBox.Show("《真的爱你》"); } void Sing1() { MessageBox.Show("《光辉岁月》"); } void Sing2() { MessageBox.Show("《海阔天空》"); } }
编译完成之后,将编译后的 委托.exe放入反编译工具.Net Reflector中,我们看一下为委托追加方法指针编译后的C#代码,图片如下
上面的追加方法的代码经过编译器编译之后的样子如下
private void button1_Click(object sender, EventArgs e) { DGSing a = new DGSing(this.Sing); a = (DGSing) Delegate.Combine(a, new DGSing(this.Sing1)); a = (DGSing) Delegate.Combine(a, new DGSing(this.Sing2)); a = (DGSing) Delegate.Remove(a, new DGSing(this.Sing2)); a(); }代码中的a 代表dg
小结
为委托追加方法的本质: 是为被追加的方法创建一个新的委托对象,并将方法指针存入对象的父类的父类(Delegate)的IntPtr变量中,然后再将新创建的委托 添加到当前委托对象(dg)的数组中。
相关文章推荐
- html样式 链接 表格
- 安卓开发——屏幕坐标相关
- 美国公路系统对IT系统的借鉴
- HDU 4614 Vases and Flowers
- HDU 1029 Ignatius and the Princess IV
- Ubuntu 15.04(Vivid Vervet)于今天停止支持
- s3c2440环境搭建与通过JTAG调试
- [LeetCode]113. Path Sum II
- 算法之LCA与RMQ问题
- SVD比较好的介绍
- 数据库多维迭代算法
- ubuntu14.04 安装gitlab
- poj 2186 强连通分量缩点+判断出度
- HDU3635 带权并查集
- DispatcherServlet初始化顺序
- 多表查询信息
- 多表查询信息
- 2.案例
- 单链表反转的2种方法
- Codeforces Round #294 (Div. 2) (D)前缀和+map