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

C#统一委托Func与Action

C#在System命名空间下提供两个委托Action和Func,这两个委托最多提供16个参数,基本上可以满足所有自定义事件所需的委托类型。几乎所有的 事件 都可以使用这两个内置的委托Action和Func进行处理。

Action委托:

Action定义提供0~16个参数,无返回值的委托

共有17种重载:

public delegate void Action();

public delegate void Action<in T>(T obj);

public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

public delegate void Action<in T1, in T2, in T3>(T1 arg1, T2 arg2, T3 arg3);

。。。。。。

public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14);

public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15);

public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);

Func委托:

Func定义提供0~16个参数,有返回类型的委托

共有17种重载:

public delegate TResult Func<out TResult>();

public delegate TResult Func<in T, out TResult>(T arg);

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

public delegate TResult Func<in T1, in T2, in T3, out TResult>(T1 arg1, T2 arg2, T3 arg3);

。。。。。。

public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14);

public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15);

public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);

Action、Func委托与常见委托的类比

线程开始委托

public delegate void ThreadStart();

System.Threading.ThreadStart 委托 类似于 Action

事件处理委托

public delegate void EventHandler(object sender, EventArgs e);

EventHandler 委托 类似于 Action<object,EventArgs>

判定委托

public delegate bool Predicate<in T>(T obj);

Predicate<T> 委托 类似于 Func<T,bool>

比较委托

public delegate int Comparison<in T>(T x, T y);

Comparison<T> 委托 类似于 Func<T, T, int>

测试程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace IntegratedDelegateDemo
{class Program{static void Main(string[] args){//Action定义无返回值的委托,最多有16个参数//Func定义一个有返回值的委托,最多有16个参数Predicate<int> predicate = x => x > 0;Func<int, bool> func = new Func<int, bool>(predicate);Comparison<double> comparison = (x, y) => x - y > 0 ? 1 : 0;int num = -8;bool isPositive = func(num);Console.WriteLine($"【{num}】是否为正数:【{isPositive}】");Func<double, double, int> funcComparion = new Func<double, double, int>(comparison);double xNumber = 7.666;double yNumber = 6.55;Console.WriteLine($"两个数字进行比较【{xNumber}】>【{yNumber}】的结果为【{funcComparion(xNumber, yNumber)}】");List<string> gjqtList = new List<string>() { "百里屠苏", "风晴雪", "红玉", "方兰生" };gjqtList.ForEach(role => Console.WriteLine(role));Action action = () => Console.WriteLine("测试无参数,无返回值委托");System.Threading.ThreadStart threadStart = new System.Threading.ThreadStart(action);threadStart.Invoke();Func<short, short, int> funcComparison = (x, y) => y - x;Comparison<short> comparisonDesc = new Comparison<short>(funcComparison);short[] testSortArray = new short[] { 50, 25, 43, 69, 16, 14, 22 };Console.WriteLine($"使用委托进行逆序排序,原数组为【{string.Join(",", testSortArray)}】");Array.Sort(testSortArray, comparisonDesc);Console.WriteLine($"逆序排序已结束,逆序排序后的数组为【{string.Join(",", testSortArray)}】");Console.ReadLine();}}
}

运行截图:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • java之 junit单元测试案例【经典版】
  • 在 CentOS-Stream-9 中使用 network 代替 NetworkManager
  • Apache AGE的MATCH子句
  • 增量预训练和微调的区别
  • Python 读取esxi上所有主机的设备信息
  • Keka for Mac v1.4.3 中文下载 解压/压缩工具
  • 【Arduino IDE】安装及开发环境、ESP32库
  • PF4J+SpringBoot
  • Vscode中Github copilot插件无法使用(出现感叹号)解决方案
  • Vite的WebSocket
  • python的tkinter、socket库开发tcp的客户端和服务端
  • 智慧博物馆的“眼睛”:视频智能监控技术守护文物安全与智能化管理
  • 详细解析Kafaka Streams中各个DSL操作符的用法
  • Hive第三天
  • 单例模式 饿汉式和懒汉式的区别
  • [LeetCode] Wiggle Sort
  • Angularjs之国际化
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • IOS评论框不贴底(ios12新bug)
  • java 多线程基础, 我觉得还是有必要看看的
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • java正则表式的使用
  • js数组之filter
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 模型微调
  • 前端路由实现-history
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 你对linux中grep命令知道多少?
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # SpringBoot 如何让指定的Bean先加载
  • %@ page import=%的用法
  • (AngularJS)Angular 控制器之间通信初探
  • (C#)一个最简单的链表类
  • (独孤九剑)--文件系统
  • (二)斐波那契Fabonacci函数
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (六)vue-router+UI组件库
  • (一)Linux+Windows下安装ffmpeg
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)EXC_BREAKPOINT僵尸错误
  • (转载)Google Chrome调试JS
  • .net 流——流的类型体系简单介绍
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET序列化 serializable,反序列化
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • []串口通信 零星笔记
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [AIGC] Java 和 Kotlin 的区别
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [C#学习笔记]Newtonsoft.Json
  • [Deepin] 简单使用 RustDesk 实现远程访问Deepin