今天又复习了一下委托的知识,并在园子里找了个不错的小例子练习了一下,做如下整理--
首先,委托和类是一个级别的,其声明方式如下:
public delegate int DelegateDemo(int a,int b);
该委托的定义就决定了:实例化该委托时,接收的方法参数必须满足--方法返回值为int,方法有两个整型参数。
*委托就是----我们把一批具有相同特征的方法,通过建立与具有同样相同特征的委托的一个实例来进行传递,以使其它地方能对这些方法进行调用。即把方法当作参数进行传递
使用:
1>简单的回调函数
public delegate void DelA();//定义委托 public void ShowMG()//定义方法 { console.writeline("委托练习"); } DelA() d=new DelA(ShowMG);//声明委托实例,并传递方法参数 d();//方法回调,输出:委托练习
2>委托链
之前方法的基础上定义如下方法: public void ShowNum() { Console.WriteLine("又一个方法"); } d+=new DelA(ShowNum);//此时委托对象d中依次传入了ShowMG,ShowNum方法 d();//依次调用ShowMG,ShowNum方法
3.小练习--通过下边小练习,本人体会到委托的一大用处:当几个方法的大部分处理逻辑相同,只有小部分逻辑不同时,可以把这一小部分逻辑抽离出来,分别定义方法,然后定义一个委托放在整个方法的改变之处,并封装成一个方法,这样,调用哪个方法,就把哪个方法传入委托就可以了--说的有些乱,看代码变很清楚了(例子非原创,觉得不错于是借鉴来整理下):
需求:textBox内输入一串数字,','连接,'升序排列','降序排列'按钮实现数字顺序的调整:
//1.定义一个委托,比较两个数的大小 public delegate bool CompareDel(int n1,int n2); //2.两个方法(经过抽离,只有如下逻辑不同) //比较大数 public bool GetLager(int n1,int n2) { return n1 > n2; } //比较小数 public bool GetSmaller(int n1, int n2) { return !GetLager(n1,n2); } //整个排序方法如下:(其中比较逻辑已由委托代替) public string GetResult(CompareDel del) { int temp; string result = ""; int[] nums = GetArray(); for (int i = 0; i < nums.Length - 1; i++) { for (int j = i + 1; j < nums.Length; j++) { if (del(nums[i], nums[j])) { temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } } foreach (var item in nums) { result += item + ","; } return result.Substring(0, result.Length - 1); } //字符串数组转整型数组 public int[] GetArray() { string[] strs = this.txtInput.Text.Split(','); int[] num = new int[strs.Length]; for (int i = 0; i < strs.Length; i++) { num[i] = int.Parse(strs[i]); } return num; } //两个按钮方法调用 //升序排列 protected void btnSmaller_Click(object sender, EventArgs e) { CompareClass c = new CompareClass(); CompareDel d = new CompareDel(c.GetLager); this.lbShow.Text = GetResult(d); } //降序排列 protected void btnLager_Click(object sender, EventArgs e) { CompareClass c = new CompareClass(); CompareDel d = new CompareDel(c.GetSmaller); this.lbShow.Text = GetResult(d); }
从这个小例子中,不难体会出委托的作用--