1. 委托的来源
在c++中有回掉函数,那么在c#也就对应有委托。委托正如字面意思,就是代理的意思。比如律师,原告将一件事情委托给律师办理。但是对于律师来讲,每天会有案件接手,我就将他们分类,比如民事案件,然后就民事案件相关法律注意发给原告,这样就放便很多。回归主题,在程序中例如主窗体获取一条信息,然后需要发给一组的控件,然后控件对这些信息进行处理,处理过程有的一样,但是控件名称不一样,这样就可将处理过程设置一个委托,统一处理,委托传入参数为信息。在主窗体中然后针对每个控件初始化一个对象,并将响应的函数注册上。
委托的实例有点类似函数指针,如果只是单纯调用委托实例,也就等同于调用函数。委托真正利用之处是作为参数传入其中,然后在这函数中对这个委托参数进行统一处理。
2 分析过程
1、分析程序中对信息Meg的不同处理和发布,讲这些不同的处理过程写成一组函数 FuncHandle1(T para1,T para2),FuncHandle2(T Para,T para);
2、根据需要定义一个委托delegateFunc指向FuncHandle,格式当然和FuncHandle相同。
3、在程序中找到Meg的获取以及FuncHandle的调用,讲这个对函数调用过程再封装成HangleDelegate(delegateFunc delegateinstance)。此函数封装了信息的获取,以及delegateInstance调用(传参数para1,para2).
4、回到主程序中,初始化delegateFunc多个实例,指向不同FuncHandle。
5 、讲不同的delegateFunc实例当做参数传入到HandleDelegate中。
3、程序实例
程序实现的功能是:在下方文本框输入文字,勾选“书写到”组合框中的“文本区1”或“文本区2”复选框后点击“开始”按钮,程序会自动将文本框中的文字”抄写“到对应的文本区中去。程序界面如下:
代码如下:
namespace TestFrmDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //2.定义一个委托 private delegate void DelegateFunc(char ch); //3、实例化委托 DelegateFunc delegateInstance; // 构造一组委托指向的函数 private void FuncHandle1(char ch) { textBox1.AppendText(ch.ToString()); } private void FuncHandle2(char ch) { textBox2.AppendText(ch.ToString()); } //讲委托作为参数传入其中 private void HandleDelegate(DelegateFunc Instancedele) { string data = textBox3.Text; for (int i = 0; i < data.Length;i++ ) { Instancedele(data[i]); } } private void button1_Click(object sender, EventArgs e) { if (checkBox1.Checked == true) { this.textBox1.Clear(); this.textBox1.Refresh(); //实例化委托。这里是对信息的处理 delegateInstance = new DelegateFunc(FuncHandle1); //委托作为参数,对信息处理后的事情,然后回到主程序 HandleDelegate(delegateInstance); this.textBox3.Focus(); this.textBox3.SelectAll(); } if (checkBox2.Checked == true) { this.textBox2.Clear(); this.textBox2.Refresh(); delegateInstance = new DelegateFunc(FuncHandle2); HandleDelegate(delegateInstance); this.textBox3.Focus(); this.textBox3.SelectAll(); } } } }
4 小结
如果要实现一个写入的文本框不止2个,而是好几十个甚至更多,那么不久要写出同样多数量的用于写入文本区的方法了吗?这样就不得不写重复的代码,导致代码的可读性就差,这样写代码也就是面向过程的一个编程方式,因为函数是对操作过程的一个封装,要解决这个问题,自然我们就想到面向对象 编程,此时我们就会想到把变化的部分封装起来,然后再把封装的对象作为一个对象传递给方法的参数的(这个思想也是一种设计模式——策略模式。C#引入委托机制后,使得方法声明和方法实现的分离,充分体现了面向对象的编程思想。