委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
简单解释:变量好控制,方法不好控制,委托可以把方法变成变量
如果我们有一个数组,里面有10个数据:(数组就是变量的一种)
int[] num = new int[10] {0,1,2,3,4,5,6,7,8,9};
现在,我们想把它们每个都输出一遍,我们可以:
- public void OutPut()
- {
- foreach (int item in num)
- {
- Console.WriteLine(item);
- }
- }
那如果我们有十个方法:
- public void Fun0()
- {
- Console.WriteLine(0);
- }
- public void Fun1()
- {
- Console.WriteLine(1);
- }
- public void Fun2()
- {
- Console.WriteLine(2);
- }
- public void Fun3()
- {
- Console.WriteLine(3);
- }
- public void Fun4()
- {
- Console.WriteLine(4);
- }
- public void Fun5()
- {
- Console.WriteLine(5);
- }
- public void Fun6()
- {
- Console.WriteLine(6);
- }
- public void Fun7()
- {
- Console.WriteLine(7);
- }
- public void Fun8()
- {
- Console.WriteLine(8);
- }
- public void Fun9()
- {
- Console.WriteLine(9);
- }
现在,我们想把它们每个都用一遍,我们就得:
- public void OutPut()
- {
- Fun0();
- Fun1();
- Fun2();
- Fun3();
- Fun4();
- Fun5();
- Fun6();
- Fun7();
- Fun8();
- Fun9();
- }
如果,这时候,你觉得还好,那需求如果继续变化:
1.周一希望执行方法2、4、6、8
2.周二想执行方法1、3、5、7
3.周三想执行方法0、1、2、3、4
4.周四想执行方法5、6、7、8、9
5.周五我希望在这10个方法里,随机抽取两个方法执行
就问你难不难受,你要写好几组
如果这时候,他和数组一样,就很好写了(这就是变量比方法好用的地方)
整数是int
字符串是string
方法是 delegate
- public void Fun0()
- {
- Console.WriteLine(0);
- }
我们需要让这个委托长得和这个普通的方法一样
- public delegate void Apple();
-
- public void Fun0()
- {
- Console.WriteLine(0);
- }
这里的格式指的是:括号里有没有参数,有没有返回值
为什么要给委托起名字?
因为你可能建很多委托啊,有参数的,没参数的,需要return的,不需要return的。
例(有参数的):
- //方法
- public void Fun1(string s)
- {
- Console.WriteLine(1);
- }
-
- //建立委托(抄方法的格式)
- public delegate void Apple1(string s);
-
-
- //把委托和方法联系起来
- public void OutPut()
- {
- Apple1 apple1 = Fun1;
- }
例(有两个参数的):
- //方法
- public void Fun2(string s,string s1)
- {
- Console.WriteLine(1);
- }
-
- //建立委托(抄方法的格式)
- public delegate void Apple2(string s, string s1);
-
- //把委托和方法联系起来
- public void OutPut()
- {
- Apple2 apple2 = Fun2;
- }
例(有返回值的):
不需要参数咱就把参数删了就行,相信大家都是灵活的宝宝~~
- //方法
- public int Fun3(string s,string s1)
- {
- Console.WriteLine(1);
- return 1;
- }
-
- //建立委托(抄方法的格式)
- public delegate int Apple3(string s, string s1);
-
- //把委托和方法联系起来
- public void OutPut()
- {
- Apple3 apple2 = Fun3;
- }
回到我们最开始的故事,我们用委托,就可以把方法当变量了
(注意,这些方法格式是一样的,都是无返回值,无参数)
方法,还是那10个方法,委托还是那个委托
public delegate void Apples(); public void Fun0() { Console.WriteLine(0); } public void Fun1() { Console.WriteLine(1); } public void Fun2() { Console.WriteLine(2); } public void Fun3() { Console.WriteLine(3); } public void Fun4() { Console.WriteLine(4); } public void Fun5() { Console.WriteLine(5); } public void Fun6() { Console.WriteLine(6); } public void Fun7() { Console.WriteLine(7); } public void Fun8() { Console.WriteLine(8); } public void Fun9() { Console.WriteLine(9); }
我们可以搞个委托数组,把这些方法都放进去
- public void OutPut()
- {
- //委托数组,Apples是之前建立的按Fun方法写的委托
- Apples[] apples =new Apples[10];
-
- apples[0] = Fun0;
- apples[1] = Fun1;
- apples[2] = Fun2;
- apples[3] = Fun3;
- apples[4] = Fun4;
- apples[5] = Fun5;
- apples[6] = Fun6;
- apples[7] = Fun7;
- apples[8] = Fun8;
- apples[9] = Fun9;
- }
开始用啦!!!!!快乐来了
- public void OutPut()
- {
- Apples[] apples =new Apples[10];
-
- apples[0] = Fun0;
- apples[1] = Fun1;
- apples[2] = Fun2;
- apples[3] = Fun3;
- apples[4] = Fun4;
- apples[5] = Fun5;
- apples[6] = Fun6;
- apples[7] = Fun7;
- apples[8] = Fun8;
- apples[9] = Fun9;
-
-
- //执行Fun0-4
- for (int i = 0; i < 5; i++)
- {
- apples[i]();
- }
-
- //执行Fun5-9
- for (int i = 5; i < 10; i++)
- {
- apples[i]();
- }
-
-
- //执行Fun1-3-5-7-9
- for (int i = 1; i < 10; i=i+2)
- {
- apples[i]();
- }
- }
就不往多的写了,意思就是这个意思,我们可以把方法当参数了,与此同时,你也可以搞list,也可以在括号里传递委托,等等等等,,,如果有疑问,请写在评论区,我会继续补充修改的~