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

C# 实例详解委托之Func、Action、delegate

 委托是.NET编程的精髓之一,在日常编程中经常用到,在C#中实现委托主要有Func、Action、delegate三种方式,这个文章主要就这三种委托的用法通过实例展开讲解。

【Func】:Func是带返回值的委托:

原型函数如下(以下展示的是有两个参数的情况):

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

用法举例1: 定义方法StringAddA

public int StringAddA(string a, string b)
{return int.Parse(a) + int.Parse(b);
}

定义委托func,然后把方法StringAddA委托给它,接下来执行委托并获取结果,注意:

Func<string, string, int> func = StringAddA;
是
Func<string, string, int> func = new Func<string, string, int>(StringAddA);的简写
Func<string, string, int> func = StringAddA;//简写
var result = func.Invoke("3", "5");//可以简化为func("3", "5")
sw.AppendLine($"【func用法1】func返回结果是:{result}");

​​​这里的执行结果是: 【func用法1】func返回结果是:8

用法举例2: 

用lamda表达式简化写法,通过+=注册实现多播委托​​​​​​​

func += (a, b) =>{return int.Parse(a) - int.Parse(b);};sw.AppendLine($"【func用法2】func返回结果是:{func("3", "5")}");

这里的执行结果是: 【func用法1】func返回结果是:-2

注意 += 可以注册多个委托,委托执行后会按顺序执行方法.

 【Action】:Action是无返回值的委托:

原型函数如下(以下展示的是有两个参数的情况):

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

用法举例:

先定义方法:StringAddB​​​​​​​

public void StringAddB(string a, string b)
{sw.AppendLine($"【Action用法】Action执行结果:{(int.Parse(a) + int.Parse(b))}");
}

实例如下:​​​​​​​

Action<string, string> action = StringAddB;//简写
IAsyncResult asyncResult = action.BeginInvoke("3", "5", null, null);//action("3","5"),BeginInvoke异步执行,即:开启新现成处理StringAddB
action.EndInvoke(asyncResult);//阻塞委托,直到执行完成
if (asyncResult.IsCompleted)
{sw.AppendLine($"【Action用法】当前异步委托线程已执行完成");
}

这里BeginInvoke是异步委托,即新开线程去处理,我们的窗体线程在1号线程,这里我们可以在StringAddB里面打印线程id号

sw.AppendLine($"【Action用法】Action执行线程id:{Thread.CurrentThread.ManagedThreadId}");

运行结果:

【Action用法】Action执行线程id:3

这里的EndInvoke是阻塞委托,直到执行完成,当然我们这里也可以用同步的Invoke去执行,甚至Invoke都可以简写去掉,直接写成action("3", "5")

【delegate】:delegate是可以有返回值也可以没返回值的委托:

使用前需要先声明:

 delegate int DelegateM(string a, string b);//声明,可以有返回值也可以没有

用法举例:​​​​​​​

//delegate用法
//DelegateM delegateM = new DelegateM(p.StringAddA);
DelegateM delegateM = StringAddA;//简写
sw.AppendLine($"【delegate用法】delegate返回结果是:{delegateM("3", "5")}");

以上就是三种委托的区别和用法讲解,那使用委托最大的优势是什么:

可以将方法当作参数去传递,用法举例如下:

   Test(func, action);//将方法委托后转化为参数进行传递

定义方法​​​​​​​

public void Test(Func<string, string, int> f, Action<string, string> a)
{a.Invoke(f.Invoke("3", "5").ToString(), "5");
}

相关文章:

C# 实例详解委托之Func、Action、delegate

委托是.NET编程的精髓之一&#xff0c;在日常编程中经常用到&#xff0c;在C#中实现委托主要有Func、Action、delegate三种方式&#xff0c;这个文章主要就这三种委托的用法通过实例展开讲解。 【Func】&#xff1a;Func是带返回值的委托&#xff1a; 原型函数如下(以下展示的…...

如何选电脑

1、CPU&#xff08;中央处理器&#xff09; 怎么看CPU型号&#xff1a;CPU:系列-代数等级核心显卡型号电压后缀 例如CPU:i7-10750H &#xff1a; 1、系列&#xff1a;Intel的酷睿i3、i5、i7、i9这四个系列的CPU&#xff0c;数字越大就代表越高端。 2、代数&#xff1a;代表…...

SpringBoot项目创建

如果使用spring的源地址创建项目失败&#xff0c;就使用 阿里云的springBoot项目创建地址&#xff1a;https://start.aliyun.com/ 1.new 一个新的项目&#xff1a; 2.选择合适的版本java的JDK和maven项目 3.选择spring web依赖 4.直接finish 5. 删除无用的包&#xff0c;然后…...

神经衰弱该如何判断?确诊为神经衰弱,日常要做好这7大护理!

神经衰弱是由于长时间处于紧张或者压力的情况下导致精神出现兴奋或者疲乏现象而伴随着一系列症状。如情绪烦恼、容易激怒、睡眠障碍、肌肉出现紧张性疼痛等&#xff0c;生活中有很多人在自己的不到休息或者遇到强大打击时就会嘲笑自己患上神经衰弱。甚至一些会盲目采取措施&…...

Linux之进程替换

进程替换1.什么是进程替换2.替换函数2.1 execl函数2.2 execv函数2.3 execlp函数2.4 execvp函数2.5 在自己的C程序上如何运行其他语言的程序&#xff1f;2.6 execle 函数2.7 小结3.一个简易的shell1.什么是进程替换 fork()之后&#xff0c;父子各自执行父进程代码的一部分&…...

关于清除浮动

浮动最早是用来做图文排版&#xff0c;为了让块级元素同行显示&#xff0c;而html中块元素是有自己的排列规则&#xff0c;一般独占一行。所以有了浮动元素&#xff0c;一旦元素浮动了就会脱离文档流&#xff0c;产生问题。怎么去清除浮动&#xff1a;&#xff08;1&#xff09…...

Uber H3 index 地图索引思考

H3 是 uber 设计的六边形空间索引&#xff0c;go 语言操作包是 h3-go&#xff0c;可以通过经纬度获取所在的 h3 六边形边界&#xff0c;每个经纬度对应的六边形都是确定的&#xff0c;每个六边形唯一对应了一个 h3index。在业务开发中&#xff0c;我们可以通过 h3index 来对地理…...

多线程的几种状态

Java-多线程的几种状态&#x1f50e;1.NEW( 系统中线程还未创建,只是有个Thread对象)&#x1f50e;2.RUNNABLE( (就绪状态. 又可以分成正在工作中和即将开始工作)&#x1f50e;3.TERMINATED(系统中的线程已经执行完了,Thread对象还在)&#x1f50e;4.TIMED_WAITING(指定时间等待…...

【算法题】1574. 删除最短的子数组使剩余数组有序

题目&#xff1a; 给你一个整数数组 arr &#xff0c;请你删除一个子数组&#xff08;可以为空&#xff09;&#xff0c;使得 arr 中剩下的元素是 非递减 的。 一个子数组指的是原数组中连续的一个子序列。 请你返回满足题目要求的最短子数组的长度。 示例 1&#xff1a; …...

理解对数——金融问题中的自然对数(以e为底的对数)

第3章 金融问题(Financial Matters)——金融问题中的自然对数If thou lend moneyto any ofMy people. ...thou shalt not beto him as a creditor;neither shall yelay upon him interest.(如果你借钱给我的任何人。 ……你不应该是他的债权人&#xff1b;也不可向他加息。)——…...

vue2进阶学习之路

HTML、CSS和JavaScript基础 在学习Vue2之前&#xff0c;需要掌握HTML、CSS和JavaScript的基础知识。包括HTML的标签、CSS的布局和样式、JavaScript的变量类型、条件语句、循环语句等。 Vue2的基础知识 掌握Vue2的基本概念和语法&#xff0c;包括Vue2实例、数据绑定、指令、组件…...

决策树ID3算法

1. 决策树ID3算法的信息论基础 机器学习算法其实很古老&#xff0c;作为一个码农经常会不停的敲if, else if, else,其实就已经在用到决策树的思想了。只是你有没有想过&#xff0c;有这么多条件&#xff0c;用哪个条件特征先做if&#xff0c;哪个条件特征后做if比较优呢&#…...

C++模板基础(一)

函数模板&#xff08;一&#xff09; ● 使用 template 关键字引入模板&#xff1a; template void fun(T) {…} – 函数模板的声明与定义 – typename 关键字可以替换为 class &#xff0c;含义相同 – 函数模板中包含了两对参数&#xff1a;函数形参 / 实参&#xff1b;模板形…...

生产者消费者模型线程池(纯代码)

目录 生产者消费者模型 条件变量&&互斥锁&#xff08;阻塞队列&#xff09; makefile Task.hpp BlockQueue.hpp BlockQueueTest.cc 信号量&&互斥锁&#xff08;环形队列&#xff09; makefile RingQueue.hpp RingQueueTest.cc 线程池&#xff08;封…...

K8s 应用的网络可观测性: Cilium VS DeepFlow

随着分布式服务架构的流行,特别是微服务等设计理念在现代应用普及开来,应用中的服务变得越来越分散,因此服务之间的通信变得越来越依赖网络,很有必要来谈谈实现微服务可观测性中越来越重要的一环——云原生网络的可观测。K8s 是微服务设计理念能落地的最重要的承载体,本文…...

3.29面试题

文章目录内存内存管理执行过程要点面试题内存 内存管理 由JVM管理 堆&#xff1a;new出来的对象&#xff08;包括成员变量、数组元素、方法的地址&#xff09;栈&#xff1a;局部变量&#xff08;包括方法的参数&#xff09;方法区&#xff1a;.class字节码文件&#xff08;…...

操作系统漏洞发现

操作系统漏洞发现前言一、操作系统漏洞发现1.1 namp2. Goby3. Nessus二&#xff0c;进行渗透测试2.1 使用工具进行渗透1. metasploit2.2 EXP2.3 复现文章三&#xff0c;操作系统漏洞修复前言 不管是对于App来说&#xff0c;还是web站点来说&#xff0c;操作系统是必须的&#x…...

Linux gdb调试底层原理

TOC 前言 linux下gdb调试程序操作过程参考本人文章:gdb调试操作; 这里不再叙述; 本文主要内容是介绍GDB本地调试的底层调试原理&#xff0c;我们来看一下GDB是通过什么机制来控制被调试程序的执行顺序; 总结部分是断点调试的底层原理&#xff0c;可以直接跳转过去先看看大概…...

LC-1647. 字符频次唯一的最小删除次数(哈希+计数)

1647. 字符频次唯一的最小删除次数 难度中等56 如果字符串 s 中 不存在 两个不同字符 频次 相同的情况&#xff0c;就称 s 是 优质字符串 。 给你一个字符串 s&#xff0c;返回使 s 成为 优质字符串 需要删除的 最小 字符数。 字符串中字符的 频次 是该字符在字符串中的出现…...

HTTP状态码

100: 接受&#xff0c;正在继续处理 200: 请求成功&#xff0c;并返回数据 201: 请求已创建 202: 请求已接受 203: 请求成为&#xff0c;但未授权 204: 请求成功&#xff0c;没有内容 205: 请求成功&#xff0c;重置内容 206: 请求成功&#xff0c;返回部分内容 301: 永久性重定…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...