您的位置:首页 > 其它

《步步深入委托》——为委托追加多个方法指针的原理

2016-02-04 21:32 183 查看
    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。(摘自百度百科的定义)

    总结上面的描述:委托就是一个能存放符合某种格式(方法签名)的方法指针的容器。既然委托能添加多个方法的指针,也就是说当我们调用委托的时候就能一次性调用多个方法,当然了,前提条件是我们得将方法的指针放入委托变量中,那么其中的原理是什么哪?

    下面我简单总结一下委托的使用。

    建一个窗体应用程序,在窗体应用程序里添加一个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)的数组中。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: