• C# 第五章『面向对象』◆第10节:委托


            从数据结构来讲,委托是和类一样的,是一种用户自定义类型。委托是方法的抽象,它存储的就是一系列具有相同签名和返回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。所有的委托都派生于System.Delegate类。

            在C#中没有指针的概念,但通过委托可以实现C/C++中函数指针的功能,且比函数指针具有更强大的能力。方法的委托就是方法的别名(或是方法的代理),通过委托不但可以执行方法,而且可以将方法传到其他的方法中,实现方法回调等。

            一、声明委托

            委托是类型,与类一样,委托类型必须在被用来创建变量以及类型对象之前声明(即委托的声明在类之外)。

            委托的声明格式为:

    1. <访问修饰符> delegate <函数返回类型> <委托名> (函数参数)
    2. public delegate void Fangfa(int num);
    3. 该语句定义了一个委托Fangfa,它可以注册返回void类型且有一个int作为参数。
    4. //-------------例如
    5. public delegate void MyDelegate();

            备注:委托可以依赖于一个类,也可以依赖于一个namespace命名空间,即在类里面声明和在类外面声明都可以。delegate可以有返回类型,也可以没有返回类型。

            二、委托的实例化

            一旦声明了委托类型,委托对象必须使用new关键字来创建,且与一个特定的方法有关。当创建委托时,传递到new语句的参数就像方法调用一样书写,但是不带有参数。

            委托实例化的格式为:

    1. <委托类型><实例名>=new<委托类型>(<注册方法>)
    2. //-----------------------例如:
    3. MyDelegate zc1 = new MyDelegate(Zhangsan.Buy);

            备注:委托只是存储了各个方法的地址,它本身是什么也不做的。

    1. using System;
    2. //声明一个委托,其实就是个“命令”
    3. public delegate void MyDelegate();
    4. namespace Project19
    5. {
    6. class Zhangsan
    7. {
    8. public static void Buy()
    9. {
    10. Console.WriteLine("我委托Zhangsan去购买。");
    11. }
    12. }
    13. class MrLi
    14. {
    15. static void Main(string[] args)
    16. {
    17. //这里就是具体阐述这个命令是干什么的
    18. MyDelegate zc1 = new MyDelegate(Zhangsan.Buy);
    19. //这时候委托被附上了具体的方法
    20. zc1();
    21. }
    22. }
    23. }

            三、委托的使用、委托的多播

            委托对象可以使用“+”运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可以被合并。“-”运算符可用域从合并的委托中移除组件委托。

            备注:“+”的作用就是将两个方法都执行一遍,而不是单纯意义的将结果相加。

            委托也可以包含多个方法,这种委托称为多播委托,也叫组播。

            对于多播,调用委托后,按照注册顺序执行。不过对于有返回值的方法,将返回最后注册的方法执行后的返回值。

    1. using System;
    2. public delegate int NumberDelegate(int num1, int num2); // 委托,声明在类之外
    3. namespace Project01
    4. {
    5. public class Program
    6. {
    7. public static int AddMethod(int num1, int num2)
    8. {
    9. Console.WriteLine("Sum={0}", num1 + num2);
    10. return num1 + num2;
    11. }
    12. public static int SubMethod(int num1, int num2)
    13. {
    14. Console.WriteLine("Sub={0}", num1 - num2);
    15. return num1 - num2;
    16. }
    17. public static void Main(string[] args)
    18. {
    19. NumberDelegate nd1 = AddMethod; //单播
    20. Console.WriteLine("委托一个方法的结果为:{0}", nd1(3, 2));
    21. NumberDelegate nd2 = SubMethod;
    22. nd2 = nd1 + nd2; //多播
    23. Console.WriteLine("委托两个方法的结果为:{0}", nd2(2, 4));
    24. }
    25. }
    26. }
  • 相关阅读:
    分布式任务调度Schedulerx2.0 Map模型作业执行流程
    Interger比较两个数值时需谨慎!
    c++:算术运算符、赋值运算符、比较运算符、逻辑运算符
    JAVA毕业设计教师教学质量评估系统计算机源码+lw文档+系统+调试部署+数据库
    PGRouting导航规划-AStar算法
    区间统计——ST算法
    docker安装常用软件记录
    服务访问质量
    Java学习笔记——字符/字符串
    Java环境的安装
  • 原文地址:https://blog.csdn.net/qq_45336030/article/details/126213059