当前位置: 首页 > 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: 永久性重定…...

Proteus仿真实战:基于STM32的波形发生器设计与实现(附源码与仿真文件)

1. 从零开始&#xff1a;STM32波形发生器的设计思路 第一次接触波形发生器项目时&#xff0c;我也被各种专业术语搞得一头雾水。后来发现&#xff0c;其实可以把STM32想象成一个音乐盒&#xff0c;DAC模块就是它的发声装置&#xff0c;而我们要做的就是教会这个音乐盒演奏不同风…...

AI 模型推理引擎性能对比

AI模型推理引擎性能对比&#xff1a;如何选择最优方案 随着AI技术在各行业的广泛应用&#xff0c;模型推理引擎的性能成为影响落地效果的关键因素。不同的推理引擎在计算效率、资源占用、兼容性等方面表现各异&#xff0c;如何选择最适合的引擎成为开发者关注的焦点。本文将从…...

告别规则几何!用Python+Matlab为gprMax创建任意复杂地质模型(附HDF5文件生成代码)

突破几何限制&#xff1a;用PythonMatlab构建gprMax复杂地质模型的完整指南 地质雷达模拟领域的研究者常面临一个尴尬困境&#xff1a;脑海中的地质结构复杂多变&#xff0c;但建模工具却只能生成规则几何体。本文将彻底解决这一矛盾&#xff0c;带您掌握跨平台协作建模技术&am…...

终极鸣潮工具箱:3大核心功能让游戏体验翻倍的完整指南

终极鸣潮工具箱&#xff1a;3大核心功能让游戏体验翻倍的完整指南 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools&#xff08;鸣潮工具箱&#xff09;是一款专为《鸣潮》玩家设计的开源游戏辅助…...

AI小剧场:OpenClaw+nanobot镜像多角色对话生成

AI小剧场&#xff1a;OpenClawnanobot镜像多角色对话生成 1. 为什么需要AI辅助剧本创作 作为一个业余编剧爱好者&#xff0c;我经常遇到创作瓶颈——当需要构建多角色对话场景时&#xff0c;很难同时兼顾不同角色的立场连贯性和语言风格差异。传统写作工具只能提供单向输出&a…...

3分钟解决ROG笔记本色彩发白问题:G-Helper智能恢复指南

3分钟解决ROG笔记本色彩发白问题&#xff1a;G-Helper智能恢复指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地…...

Matrix Motor Extension:四通道嵌入式电机驱动模块详解

1. 项目概述Matrix Motor Extension 是一款面向嵌入式控制场景的四通道直流电机驱动扩展模块&#xff0c;专为需要多轴独立运动控制的智能硬件平台设计。其核心定位并非通用型电机驱动板&#xff0c;而是作为主控系统&#xff08;如 STM32、ESP32、Raspberry Pi Pico 等&#x…...

不止是字体!用Qt Creator样式表自定义你的IDE主题(附工具栏优化)

不止是字体&#xff01;用Qt Creator样式表打造个性化开发环境 作为一名长期使用Qt Creator的开发者&#xff0c;你是否曾对默认界面的单调感到审美疲劳&#xff1f;或是被工具栏上过小的字体折磨得眼睛酸痛&#xff1f;其实&#xff0c;Qt Creator的界面定制能力远超大多数人的…...

三步解决Windows系统Cursor试用限制:go-cursor-help技术工具重置方案

三步解决Windows系统Cursor试用限制&#xff1a;go-cursor-help技术工具重置方案 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgra…...

保姆级教程:用Python和Open3D玩转激光雷达点云与图像融合(附KITTI数据集实战)

从零实现激光雷达与相机融合&#xff1a;Open3DKITTI实战指南 当激光雷达的精确测距遇上相机的丰富纹理&#xff0c;自动驾驶感知系统便拥有了"立体视觉"——这正是多模态融合技术的魅力所在。本文将带您用Python和Open3D构建一个完整的点云-图像融合流水线&#xff…...