news 2026/6/10 17:03:52

精:C# 的四种委托实现详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
精:C# 的四种委托实现详解

一、什么是委托

1.1 官方解释

委托是一种定义方法签名的类型。当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联,并通过委托实例调用该方法。

1.2 个人理解

委托就是用于封装和执行方法(函数)的一个类。

事件是一种特殊的委托。


二、如何声明委托

C# 中有四种常见的委托声明方式:

2.1delegate(自定义委托)

public delegate int TestDelegate(int x, int y);
  • 可以无返回值,也可以指定返回值类型。

  • 支持0 到 32 个参数

2.2Action(无返回值泛型委托)

  • 无返回值(即返回void)。

  • 支持0 到 16 个参数

示例:

  • Action:无参,无返回值。

  • Action<int, string>:接收intstring参数,无返回值。

  • Action<int, string, bool>:三个参数,无返回值。

  • Action<int, int, int, int>:四个int参数,无返回值。

2.3Func(有返回值泛型委托)

  • 必须有返回值(不能为void)。

  • 支持0 到 16 个输入参数,最后一个泛型参数为返回类型。

示例:

  • Func<int>:无参,返回int

  • Func<object, string, int>:接收objectstring,返回int

  • Func<T1, T2, T3, int>:三个泛型输入参数,返回int

2.4Predicate(布尔返回值泛型委托)

  • 仅接受一个参数

  • **返回值固定为bool**。

示例:

  • Predicate<int>:接收int,返回bool

  • 定义形式:public delegate bool Predicate<T>(T obj);

2.5 四者之间的区别总结

委托类型

参数数量范围

返回值要求

delegate

0 ~ 32

可无返回值,也可指定类型

Action

0 ~ 16

无返回值(void

Func

0 ~ 16(+1 返回值)

必须有返回值

Predicate仅 1 个

返回值固定为bool

注:部分资料中提到 Action/Func 最多支持 4 个参数,这是早期 .NET 版本限制;现代 C#(.NET Framework 4.0+ / .NET Core)已支持最多16 个参数


三、委托的使用示例

3.1delegate的使用

public delegate int MethodDelegate(int x, int y); private static MethodDelegate method; static void Main(string[] args) { method = new MethodDelegate(Add); Console.WriteLine(method(10, 20)); // 输出:30 Console.ReadKey(); } private static int Add(int x, int y) => x + y;

3.2Action的使用

static void Main(string[] args) { Test<string>(Action, "Hello World!"); Test<int>(Action, 1000); Test<string>(p => Console.WriteLine("{0}", p), "Lambda Hello"); Console.ReadKey(); } public static void Test<T>(Action<T> action, T p) => action(p); private static void Action(string s) => Console.WriteLine(s); private static void Action(int s) => Console.WriteLine(s);

Action常用于执行操作,无需返回结果。

3.3Func的使用

static void Main(string[] args) { Console.WriteLine(Test<int, int>(Fun, 100, 200)); // 输出:300 Console.ReadKey(); } public static int Test<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b) => func(a, b); private static int Fun(int a, int b) => a + b;

Func常用于需要返回计算结果的场景。

3.4Predicate的使用

static void Main(string[] args) { Point[] points = { new Point(100, 200), new Point(150, 250), new Point(250, 375), new Point(275, 395), new Point(295, 450) }; Point first = Array.Find(points, ProductGT10); Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y); Console.ReadKey(); } private static bool ProductGT10(Point p) => p.X * p.Y > 100000;

Predicate常用于集合筛选(如Array.Find,List.FindAll等)。


四、委托的清空

4.1 方法一:循环移除

public MethodDelegate OnDelegate; public void ClearDelegate() { while (OnDelegate != null) { OnDelegate -= OnDelegate; } }

⚠️ 注意:此写法在多线程环境下可能不安全,且逻辑上存在争议(每次减去自身可能导致未完全清除)。更推荐方法二。

4.2 方法二:使用GetInvocationList

public MethodDelegate OnDelegate; static void Main(string[] args) { Program test = new Program(); if (test.OnDelegate != null) { Delegate[] dels = test.OnDelegate.GetInvocationList(); foreach (var del in dels) { test.OnDelegate -= (MethodDelegate)del; } } }

此方法安全可靠,适用于多播委托的彻底清空。


五、委托的特点

  • 类似于 C++ 的函数指针,但类型安全

  • 允许将方法作为参数传递

  • 可用于实现回调机制

  • 支持多播(多个方法绑定到同一个委托,依次调用)。

  • 方法签名不必完全一致(协变/逆变支持)。


六、总结

类型

参数数量

返回值

典型用途

delegate

0–32

任意或无

自定义委托

Action

0–16

无(void

执行操作

Func

0–16

必须有

计算并返回结果

Predicate

1

bool

条件判断、筛选


参考资料:

  • http://www.fengfly.com/plus/view-209140-1.html

  • http://www.cnblogs.com/foolishfox/archive/2010/09/16/1827964.html

  • https://www.cnblogs.com/akwwl/p/3232679.html

  • https://www.cnblogs.com/xiao-qian/p/12688043.html

- EOF -

技术群:添加小编微信dotnet999

公众号:dotnet讲堂

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

AI技术分析股票财报

AI技术已经从简单的“数据提取”进化为深度的“策略参谋”&#xff0c;彻底重塑了股票财报分析的流程。以下是AI在该领域的核心应用场景。1. 深度非结构化数据处理传统的财报分析往往集中在利润表、资产负债表等硬性指标。AI利用自然语言处理 (NLP) 技术&#xff0c;能够瞬间穿…

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

2026年AI工程师必备的软技能清单:软件测试从业者的转型指南

软技能在AI时代的战略价值 随着AI技术从实验室走向产业应用&#xff0c;软件测试从业者正面临前所未有的转型挑战。2025年数据显示&#xff0c;AI在测试领域的渗透率已超40%&#xff0c;新发AI岗位量同比增长543%&#xff0c;薪资溢价超18%。硬技能如编程和工具操作固然重要&a…

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

写论文软件哪个好?实测爆款!虎贲等考 AI 凭全流程服务 C 位出道

毕业论文写作堪称学术生涯的 “硬核闯关”&#xff0c;选题跑偏、文献堆砌、查重超标、AI 痕迹明显&#xff0c;每一个环节都能让人焦头烂额。市面上的论文软件琳琅满目&#xff0c;有的专攻降重&#xff0c;有的擅长生成&#xff0c;却鲜少有能一站式搞定全流程的 “全能选手”…

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

PCB丝印常见缺陷分析及预防措施

今天我们聚焦 PCB 生产中的丝印工序&#xff0c;聊聊偏移、模糊、脱落、渗油这四大典型缺陷的根因和预防方案。丝印作为 PCB 表面标识与防护的关键环节&#xff0c;直接影响产品的可读性、美观度和可靠性&#xff0c;做好制程控制至关重要。一、 丝印偏移&#xff1a;图案位置 …

作者头像 李华