• C#难点语法讲解之委托---从应用需求开始讲解


    一、委托的定义

    委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

    简单解释:变量好控制,方法不好控制,委托可以把方法变成变量

    二、例子解释定义

    如果我们有一个数组,里面有10个数据:(数组就是变量的一种)

    int[] num = new int[10] {0,1,2,3,4,5,6,7,8,9};

    现在,我们想把它们每个都输出一遍,我们可以:

    1. public void OutPut()
    2. {
    3. foreach (int item in num)
    4. {
    5. Console.WriteLine(item);
    6. }
    7. }

    那如果我们有十个方法:

    1. public void Fun0()
    2. {
    3. Console.WriteLine(0);
    4. }
    5. public void Fun1()
    6. {
    7. Console.WriteLine(1);
    8. }
    9. public void Fun2()
    10. {
    11. Console.WriteLine(2);
    12. }
    13. public void Fun3()
    14. {
    15. Console.WriteLine(3);
    16. }
    17. public void Fun4()
    18. {
    19. Console.WriteLine(4);
    20. }
    21. public void Fun5()
    22. {
    23. Console.WriteLine(5);
    24. }
    25. public void Fun6()
    26. {
    27. Console.WriteLine(6);
    28. }
    29. public void Fun7()
    30. {
    31. Console.WriteLine(7);
    32. }
    33. public void Fun8()
    34. {
    35. Console.WriteLine(8);
    36. }
    37. public void Fun9()
    38. {
    39. Console.WriteLine(9);
    40. }

    现在,我们想把它们每个都用一遍,我们就得:

    1. public void OutPut()
    2. {
    3. Fun0();
    4. Fun1();
    5. Fun2();
    6. Fun3();
    7. Fun4();
    8. Fun5();
    9. Fun6();
    10. Fun7();
    11. Fun8();
    12. Fun9();
    13. }

    如果,这时候,你觉得还好,那需求如果继续变化:

    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

    四、把一个已经有的方法和delegate联系起来

    1.联系一个普通方法
    1. public void Fun0()
    2. {
    3. Console.WriteLine(0);
    4. }

    我们需要让这个委托长得和这个普通的方法一样

    1. public delegate void Apple();
    2. public void Fun0()
    3. {
    4. Console.WriteLine(0);
    5. }

    这里的格式指的是:括号里有没有参数,有没有返回值

    为什么要给委托起名字?

    因为你可能建很多委托啊,有参数的,没参数的,需要return的,不需要return的。

    例(有参数的):

    1. //方法
    2. public void Fun1(string s)
    3. {
    4. Console.WriteLine(1);
    5. }
    6. //建立委托(抄方法的格式)
    7. public delegate void Apple1(string s);
    8. //把委托和方法联系起来
    9. public void OutPut()
    10. {
    11. Apple1 apple1 = Fun1;
    12. }

    例(有两个参数的):

    1. //方法
    2. public void Fun2(string s,string s1)
    3. {
    4. Console.WriteLine(1);
    5. }
    6. //建立委托(抄方法的格式)
    7. public delegate void Apple2(string s, string s1);
    8. //把委托和方法联系起来
    9. public void OutPut()
    10. {
    11. Apple2 apple2 = Fun2;
    12. }

    例(有返回值的):

    不需要参数咱就把参数删了就行,相信大家都是灵活的宝宝~~

    1. //方法
    2. public int Fun3(string s,string s1)
    3. {
    4. Console.WriteLine(1);
    5. return 1;
    6. }
    7. //建立委托(抄方法的格式)
    8. public delegate int Apple3(string s, string s1);
    9. //把委托和方法联系起来
    10. public void OutPut()
    11. {
    12. Apple3 apple2 = Fun3;
    13. }

    五、委托应用

    回到我们最开始的故事,我们用委托,就可以把方法当变量了

    (注意,这些方法格式是一样的,都是无返回值,无参数)

    方法,还是那10个方法,委托还是那个委托

    1. public delegate void Apples();
    2. public void Fun0()
    3. {
    4. Console.WriteLine(0);
    5. }
    6. public void Fun1()
    7. {
    8. Console.WriteLine(1);
    9. }
    10. public void Fun2()
    11. {
    12. Console.WriteLine(2);
    13. }
    14. public void Fun3()
    15. {
    16. Console.WriteLine(3);
    17. }
    18. public void Fun4()
    19. {
    20. Console.WriteLine(4);
    21. }
    22. public void Fun5()
    23. {
    24. Console.WriteLine(5);
    25. }
    26. public void Fun6()
    27. {
    28. Console.WriteLine(6);
    29. }
    30. public void Fun7()
    31. {
    32. Console.WriteLine(7);
    33. }
    34. public void Fun8()
    35. {
    36. Console.WriteLine(8);
    37. }
    38. public void Fun9()
    39. {
    40. Console.WriteLine(9);
    41. }

    我们可以搞个委托数组,把这些方法都放进去 

    1. public void OutPut()
    2. {
    3. //委托数组,Apples是之前建立的按Fun方法写的委托
    4. Apples[] apples =new Apples[10];
    5. apples[0] = Fun0;
    6. apples[1] = Fun1;
    7. apples[2] = Fun2;
    8. apples[3] = Fun3;
    9. apples[4] = Fun4;
    10. apples[5] = Fun5;
    11. apples[6] = Fun6;
    12. apples[7] = Fun7;
    13. apples[8] = Fun8;
    14. apples[9] = Fun9;
    15. }

    开始用啦!!!!!快乐来了

    1. public void OutPut()
    2. {
    3. Apples[] apples =new Apples[10];
    4. apples[0] = Fun0;
    5. apples[1] = Fun1;
    6. apples[2] = Fun2;
    7. apples[3] = Fun3;
    8. apples[4] = Fun4;
    9. apples[5] = Fun5;
    10. apples[6] = Fun6;
    11. apples[7] = Fun7;
    12. apples[8] = Fun8;
    13. apples[9] = Fun9;
    14. //执行Fun0-4
    15. for (int i = 0; i < 5; i++)
    16. {
    17. apples[i]();
    18. }
    19. //执行Fun5-9
    20. for (int i = 5; i < 10; i++)
    21. {
    22. apples[i]();
    23. }
    24. //执行Fun1-3-5-7-9
    25. for (int i = 1; i < 10; i=i+2)
    26. {
    27. apples[i]();
    28. }
    29. }

    就不往多的写了,意思就是这个意思,我们可以把方法当参数了,与此同时,你也可以搞list,也可以在括号里传递委托,等等等等,,,如果有疑问,请写在评论区,我会继续补充修改的~

  • 相关阅读:
    Spring Boot 邮件发送(五种类型的邮件)
    ElasticSearch(ES)简单介绍
    Aigtek高精度电流源仪器设计规范
    外包干了10个月,技术退步明显.......
    lc[链表]---203.移除链表元素
    三、react组件的生命周期
    经典循环神经网络(一)RNN及其在歌词数据集上的应用
    Mysql8.0&Mysql5.7&Mysql5.6&Mysql5.5特性对比
    flink sql 毫秒转date ms转date
    图扑数字孪生智慧加油站,构建安全防护网
  • 原文地址:https://blog.csdn.net/weixin_49427945/article/details/132763212