news 2026/5/12 2:14:32

精: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/5/10 21:53:09

卫星通信-145页.pptx

关注、星标公众号&#xff0c;精彩内容每日送达 来源&#xff1a;网络素材&#xff08;全文完&#xff09;声明&#xff1a;我们尊重原创&#xff0c;也注重分享&#xff1b;文字、图片版权归原作者所有。转载目的在于分享更多信息&#xff0c;不代表本号立场&#xff0c;如有侵…

作者头像 李华
网站建设 2026/5/10 21:54:17

(3-1)机器人身体结构与人体仿生学:人体生物力学与关节分析

本章内容围绕人形机器人身体结构与人体仿生学展开&#xff0c;系统分析了人体生物力学特征及其对机器人结构设计的指导意义。首先从关节自由度、运动范围与扭矩需求入手&#xff0c;结合力臂与质量分布&#xff0c;阐明人体动态平衡的力学基础&#xff1b;随后重点介绍了人形机…

作者头像 李华
网站建设 2026/5/10 10:47:54

多商户+多端一体化:商城系统的核心功能架构与源码实现

温馨提示&#xff1a;文末有资源获取方式寻找一款既能自主创业&#xff0c;又能开启技术服务业务的电商系统&#xff1f;您的需求&#xff0c;现在有了完美的答案。我们为您带来一款经过重磅升级、功能堪称豪华的多端多商户商城源码&#xff0c;它专为有远见的创业者与开发者设…

作者头像 李华
网站建设 2026/4/30 20:37:58

写论文软件哪个好?实测封神!虎贲等考 AI 凭全流程硬核实力 C 位出圈

还在为毕业论文熬秃脑袋&#xff1f;选题迷茫、文献堆砌、查重超标、AI 痕迹明显&#xff0c;每一个环节都让人焦头烂额。市面上的论文软件五花八门&#xff0c;有的只懂降重&#xff0c;有的只会生成文字&#xff0c;真正能一站式搞定论文全流程的少之又少。作为深耕论文写作科…

作者头像 李华
网站建设 2026/5/10 19:12:20

2026最新PotPlayer下载安装使用教程:轻量高效的视频播放器全面解析

前言 在各类视频播放软件中&#xff0c;PotPlayer长期以轻量、高性能和兼容性强著称&#xff0c;深受视频剪辑师、影视爱好者以及技术用户青睐。它不仅可以播放主流格式视频&#xff0c;还支持高清、蓝光乃至4K影片的流畅播放。如果你正在寻找一款稳定又功能强大的播放器&…

作者头像 李华