当前位置: 首页 > news >正文

【C#】委托是什么

在 C# 中,委托(Delegate) 是一种类型安全的函数指针,可以将方法作为参数传递或者保存方法的引用。下面详细介绍一下委托的相关概念和用法:

1. 基本概念

  • 类型安全:委托在声明时会指定方法的返回类型和参数列表,只有符合签名的方法才能赋值给该委托,保证了类型安全。
  • 多播能力:委托不仅可以引用一个方法,还能同时引用多个方法。当调用委托时,会依次调用所有被引用的方法(适用于返回类型为 void 的委托)。
  • 面向对象:委托是对象,可以赋值、传递、比较等,与其他对象一样。

2. 委托的声明与使用

  • 声明委托:使用 delegate 关键字来定义一个委托类型。例如:

    public delegate int MathOperation(int a, int b);
    

    这里声明了一个 MathOperation 委托,要求所引用的方法必须接受两个 int 参数并返回一个 int

  • 实例化委托:可以将符合签名的方法赋值给委托对象:

    public class Calculator {
        public int Add(int x, int y) {
            return x + y;
        }
    }
    
    // 使用委托
    Calculator calc = new Calculator();
    MathOperation op = new MathOperation(calc.Add);
    int result = op(3, 4);  // result 为 7
    
  • 匿名方法和 Lambda 表达式:除了直接引用已有方法,还可以使用匿名方法或 Lambda 表达式来创建委托实例:

    MathOperation multiply = delegate (int x, int y) {
        return x * y;
    };
    
    MathOperation subtract = (x, y) => x - y;
    

3. 多播委托

  • 组合委托:多播委托可以同时指向多个方法,使用 + 操作符或者 Delegate.Combine 方法将多个方法组合到一个委托中:
    public delegate void Notify();  // 返回类型为 void 的委托
    
    public class Process {
        public void MethodA() {
            Console.WriteLine("MethodA called");
        }
        public void MethodB() {
            Console.WriteLine("MethodB called");
        }
    }
    
    Process p = new Process();
    Notify notifyDel = p.MethodA;
    notifyDel += p.MethodB;  // 添加第二个方法
    notifyDel();  // 依次调用 MethodA 和 MethodB
    
    注意,对于返回值不为 void 的委托,多播时只会返回最后一个方法的返回值。

4. 委托的实际应用

  • 事件处理:委托是 C# 事件模型的核心。事件通常由一个委托类型(例如 EventHandler)来定义,当事件触发时,所有注册的事件处理方法都会被调用。
  • 回调机制:通过委托,可以实现回调方法,允许某个方法在执行完毕后通知其他方法执行特定逻辑。
  • 灵活的设计模式:委托常用于策略模式、观察者模式等场景,提高代码的灵活性和可扩展性。

5. 总结

委托在 C# 中扮演着连接方法与调用者的桥梁角色,它使得程序能够更加灵活地处理方法调用、事件通知和回调等场景。通过类型安全、易于组合和传递,委托成为构建松耦合、可扩展系统的重要工具。


文章转载自:

http://hPUQixrW.mfqmk.cn
http://5t9Qjaxg.mfqmk.cn
http://QNbapj8c.mfqmk.cn
http://7wanuLaH.mfqmk.cn
http://lc4BhodW.mfqmk.cn
http://LLkhZEZE.mfqmk.cn
http://IQLPw43T.mfqmk.cn
http://87R9if2g.mfqmk.cn
http://O0OkzkCR.mfqmk.cn
http://Eg3zOSEm.mfqmk.cn
http://en81yolX.mfqmk.cn
http://deIJstA6.mfqmk.cn
http://oh1iNe5Z.mfqmk.cn
http://TWbLhd9u.mfqmk.cn
http://YFmuowm8.mfqmk.cn
http://PW2BoZEL.mfqmk.cn
http://fFzgLlLg.mfqmk.cn
http://sI6Eh8K9.mfqmk.cn
http://urru6xvo.mfqmk.cn
http://LFcQv38g.mfqmk.cn
http://2xDhFL44.mfqmk.cn
http://fbWv9TD0.mfqmk.cn
http://qAT8MXpA.mfqmk.cn
http://nvP6Q3Sj.mfqmk.cn
http://CVeqpPiH.mfqmk.cn
http://U3cguTRw.mfqmk.cn
http://5ibpTIRY.mfqmk.cn
http://X3kcWFlt.mfqmk.cn
http://sOe1IKmM.mfqmk.cn
http://jDlpJM90.mfqmk.cn
http://www.dtcms.com/a/52616.html

相关文章:

  • LLM | 论文精读 | CVPR | PEACE : 通过多模态大语言模型(MLLMs)赋能地质图全面理解
  • doris: MySQL
  • ASP .NET Core 学习(.NET9)Serilog日志整合
  • *pu相关概念介绍
  • 获取Kernel32基地址
  • 如何构建一个 Docker 镜像?
  • [数字图像处理]实验三:直方图增强
  • 快速生成viso流程图图片形式
  • web渲染技术与SEO—第一章—SEO详解
  • Redis——快速入门
  • Redis 主从复制、哨兵与集群的关系及工作原理详解
  • 关于 QPalette设置按钮背景未显示出来 的解决方法
  • Spring 为什么要有依赖注入
  • Python快捷手册
  • HCIA-IP路由动态-RIP
  • Qt5 C++ QMap使用总结
  • Unity Shader学习日记 part6 基本光照模型
  • CES Asia 2025增设未来办公教育板块,科技变革再掀高潮
  • Trae 是一款由 AI 驱动的 IDE,让编程更加愉悦和高效。国际版集成了 GPT-4 和 Claude 3.5,国内版集成了DeepSeek-r1
  • 【CXX】4.4 其他构建系统
  • 分布式多卡训练(DDP)踩坑
  • 解锁Android RemoteViews:跨进程UI更新的奥秘
  • 软考架构师笔记-存储管理
  • 边缘计算在豪越智慧消防中的应用探索
  • pgsql行列转换
  • 大数据学习(56)-Impala
  • 初次使用 IDE 搭配 Lombok 注解的配置
  • kafka配置
  • 迷你世界脚本文字板接口:Graphics
  • 掌握 Python 高级特性:深入理解迭代器与生成器