news 2026/6/10 20:04:43

C#委托:灵活方法调用的秘密

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#委托:灵活方法调用的秘密

委托的概念

委托是一种引用类型,用于封装具有特定参数列表和返回类型的方法。它类似于函数指针,但提供了更高的安全性和灵活性。委托允许将方法作为参数传递、存储在变量中或从其他方法返回。

委托的声明与使用

委托的声明需要指定方法的签名(参数和返回类型)。例如:

delegate int MathOperation(int a, int b);

声明后,可以将任何匹配签名的方法赋值给委托实例:

int Add(int x, int y) => x + y; MathOperation operation = Add; int result = operation(3, 5); // 调用委托,结果为8

多播委托

委托支持多播,即一个委托实例可以绑定多个方法,调用时会按顺序执行所有方法。通过+=-=运算符添加或移除方法:

void LogStart() => Console.WriteLine("开始计算"); void LogEnd() => Console.WriteLine("计算结束"); MathOperation operation = Add; operation += (a, b) => { LogStart(); return a * b; }; operation += (a, b) => { LogEnd(); return 0; };

注意:多播委托的返回值通常是最后绑定的方法的返回值。

内置委托类型

.NET 提供了常用的内置委托类型,无需自定义:

  • Action:无返回值的方法(支持最多16个参数)。
  • Func:有返回值的方法(最后一个泛型参数为返回类型)。
  • Predicate<T>:返回布尔值的单参数方法。

示例:

Func<int, int, int> func = Add; Action<string> log = message => Console.WriteLine(message);

委托的应用场景

  1. 事件处理:委托是事件的基础,用于实现发布-订阅模式。
  2. 回调机制:将方法作为参数传递给异步操作或耗时任务。
  3. 策略模式:通过委托动态切换算法或行为。

匿名方法与Lambda表达式

C# 允许使用匿名方法或Lambda简化委托的声明:

MathOperation operation = delegate(int a, int b) { return a - b; }; // 或使用Lambda MathOperation operation = (a, b) => a / b;

注意事项

  • 委托实例不可变,+=-=会返回新实例。
  • 避免长时间持有委托引用,可能导致内存泄漏(如事件未注销)。
  • 多播委托的执行顺序与绑定顺序一致,但依赖此特性时需谨慎设计。

通过合理使用委托,可以提升代码的模块化和扩展性,尤其在需要动态行为或解耦的场景中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:45:16

22、Awk 实用指南:从基础到高级应用

Awk 实用指南:从基础到高级应用 1. 处理格式异常的文件行 在处理文件时,可能会遇到文件中某些行的字段数量不符合预期的情况。例如,在 vegetables 文件中,如果部分数据录入错误,可能会出现字段数少于或多于三个的行,而之前的 Awk 脚本无法正确处理这些行。 为了解决…

作者头像 李华
网站建设 2026/6/10 11:44:13

同样做黑五,他凭效率赚翻倍?新常态玩法揭秘

一年一度的黑色星期五购物节&#xff0c;意义已经超越单日销量的数字狂欢&#xff0c;2025年的黑五&#xff0c;成为一面映照全球电商格局转型的镜子&#xff0c;它标志着行业从追求短期爆发的“冲动博弈”&#xff0c;全面转向一场考验长期布局、精细运营与多平台协同的“效率…

作者头像 李华
网站建设 2026/6/10 11:40:22

汇编语言全接触-29.Win32调试API二

我们继续Win32调试API的话题。在本章中&#xff0c;我们将要学习如何修改被调试程序。下载 the example 理论:在前面一章中&#xff0c;我们学会了如何装载被调试的进程以及如何处理进程中发生的事件。为了有实际用途&#xff0c;我们的程序应具有修改被调试程序的能力。有好几…

作者头像 李华
网站建设 2026/6/10 10:49:15

大模型进阶之路:RAG与DeepSeek技术融合与最佳实践(建议收藏)

简介 本文分析了RAG与DeepSeek的结合效果&#xff0c;通过法律领域实验发现&#xff1a;DeepSeek在推理生成阶段表现优异&#xff0c;但不适合检索任务&#xff0c;应与专业嵌入模型(如Qwen2)分工协作。这种组合在需要强推理和高可追溯性的场景(如法律咨询)有潜力&#xff0c;关…

作者头像 李华
网站建设 2026/6/10 7:05:54

【Flink】Flink架构深度剖析:JobManager与TaskManager

Flink架构深度剖析&#xff1a;JobManager与TaskManager 前言 上一篇我们成功跑起了第一个 Flink 程序&#xff0c;但你有没有想过&#xff1a;当你点击"运行"后&#xff0c;代码是怎么被执行的&#xff1f;数据是怎么在多个节点之间流动的&#xff1f; 这篇文章我…

作者头像 李华
网站建设 2026/6/10 12:25:59

(21)手写Spring框架

Spring IoC容器的实现原理&#xff1a;工厂模式 解析XML 反射机制。 我们给自己的框架起名为&#xff1a;myspring&#xff08;我的春天&#xff09; 第一步&#xff1a;创建模块myspring 采用Maven方式新建Module&#xff1a;myspring打包方式采用jar&#xff0c;并且引入do…

作者头像 李华