C#中的委托、匿名方法、Lambda、Action和Func

委托

委托概述

委托是存有对某个方法的引用的一种引用类型变量。定义方法的类型,可以把一个方法当作另一方法的参数。所有的委托(Delegate)都派生自 System.Delegate 类。委托声明决定了可由该委托引用的方法。

# 声明委托类型

委托类型声明与方法类似,可以理解为方法的类型,它与方法声明不同的地方:

  • 以delegate关键字开头
  • 没有方法主体
delegate void ShowInfo();//可带参数,可不带参数

它不需要在类内部声明,因为它是类型声明,委托可指向一个与其具有相同标签的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp2
{delegate void ShowInfo();public class Program{static void Main(string[] args){ShowInfo showinfo = ShowInfo;//把签名赋值给委托变量showinfo?.Invoke();//调用委托,可指向相同标签的方法}static void ShowInfo(){Console.WriteLine("打印ShowInfo方法");}}
}

运行结果:
在这里插入图片描述

创建委托实例

法一
第一种是使用带new关键字进行创建,操作组成如下:

  • 委托类型名称
  • 一组圆括号,其中参数列表为成员的方法的名称,该方法可以是实例方法也可以是静态方法
MyDel delVar;//声明委托类型的变量
MyDel delVar= new MyDel(实例方法);//创建委托并保存引用
MyDel delVar= new MyDel(静态方法);//创建委托并保存引用

法二
可以使用快捷语法,仅由方法说明符组成,因为在方法名称和其相对应的委托类型之间存在隐式转换,可以理解为方法赋值给委托变量

delVar = 实例方法;//创建委托并保存引用
delVar = 静态方法;//创建委托并保存引用

委托的调用

可以通过两种方式调用委托。一种是像调用方法一样调用委托,另外一种是使用委托的Invoke方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp2
{delegate void Show();public class Test{//静态方法public static void Print1(){Console.WriteLine("打印静态方法");}//实例方法public void Print2(){Console.WriteLine("打印实例方法");}}public class Program{static void Main(string[] args){Test test = new Test();//1、调用方法一样调用委托Show show = test.Print2;//实例方法赋值给委托变量show();//调用委托Show show2 = Test.Print1;//静态方法赋值给委托变量show2();//调用委托//2、使用委托的Invoke方法show?.Invoke();//使用Invoke和空条件运算符show2?.Invoke();}}
}

委托的多播

委托对象可使用 “+” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。“-” 运算符可用于从合并的委托中移除委托。

匿名方法

匿名方法提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。
匿名方法表达式的语法包含如下组成部分:

  • delegate关键字
  • 参数列表,如果语句快没有使用任何参数则可以省略
  • 语句快,它包含了匿名方法的代码
delegate ( 参数 ) {语句块};

案例

using System.Text;
using System.Threading.Tasks;namespace ConsoleApp2
{delegate void Show();delegate int Add(int a, int b);public class Program{static void Main(string[] args){//不带参数Show show = delegate{Console.WriteLine("打印匿名方法");};show();//带参数Add add = delegate(int a, int b){int c = a + b;Console.WriteLine("和为多少:" + c);return c;};add(1,2);Console.ReadKey();}}
}

运行结果:
在这里插入图片描述

Lambda表达式

在匿名方法中,delegate关键字有点多余,因为编译器已经指定我们在将方法赋值给委托,因此我们可以利用Lambda表达式删除delegate关键字。在参数列表和匿名方法主体之间放置Lambda运算符=>。Lambda运算符读作"goes to"。如下代码演示这种转换。

MyDel del = delegate(int x) {return x+1};//匿名方法
MyDel del = (int x) =>{return x+1};//Lambda表达式

上面看起来简洁,但是只省略6个字符,然后,编译器可以推断更多的信息,因此我们可以进一步简化。

  • 编译器可以从委托声明指定委托参数的类型,因此Lambda表达式可以省略参数的类型。如del1
    • 如果只有一个隐式类型参数还可以省略圆括号。如del2
  • Lambda表达式运行表达式的主体是语句块或表达式,如果语句块包含了返回语句,则可以省略return关键字。如del3
MyDel del = delegate(int x) {return x+1};//匿名方法
MyDel del1 = (x) =>{return x+1};//Lambda表达式
MyDel del2 = x =>{return x+1};//Lambda表达式
MyDel del3 = x =>x+1;//Lambda表达式

Action 和Func

Action和Func都是.net内置的委托,可以使用他们以参数形式传递方法。他们都支持0-16个参数,然后Action没有返回值类型,Func有返回值类型,Func最后一个参数为返回值类型。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp2
{public class Program{static void Main(string[] args){#region{//不带参数Action act1 = () => { Console.WriteLine("打印"); };act1();//带1个参数Action<int> act4 = a => { Console.WriteLine("a="+a); };//这里不能省略{}act4(2);//不带参数,带返回值Func<int> func1 = () => { return 1; };func1();//带1个参数,带带返回值Func<int, int> func2 = a => {   int b = a + 1;Console.WriteLine("b=" + b);return b;};func2(2);}#endregionConsole.ReadKey();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/57788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现代Web酒店客房管理:基于Spring Boot的实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

C#与Sqlite数据库

1&#xff0c;一般的访问方式。 1.1&#xff0c;连接语句。 //sqlite 连接,支持相对位置&#xff0c;也支持绝对位置 Data Source../../Database/cater.db// 连接数据库&#xff0c;FailIfMissingfalse时若文件不存在会自动创建 string connStr "DataSourcetest.db;Vers…

Linux相关概念和易错知识点(16)(Shell原理、进程属性和环境变量表的联系)

Shell原理及其模拟实现 在认识进程exec系列函数、命令行参数列表、环境变量之后&#xff0c;我们可以尝试理解一下Shell的原理&#xff0c;将各方知识串联起来&#xff0c;让Shell跑起来才能真正理解这些概念。我会以模拟Shell执行的原理模拟一个Shell。途中配上相关讲解。 1…

基于flask和neo4j的医疗知识图谱展示问答系统

如果你仍在为毕业设计的选题发愁&#xff0c;或者想通过技术项目提升专业实力&#xff0c;这个基于Flask和Neo4j的医疗知识图谱展示与问答系统&#xff0c;绝对是个不错的选择&#xff01; 项目亮点大揭秘&#xff1a; 知识图谱与问答结合&#xff1a;我们采用了医疗场景下的知…

时间数据可视化基础实验(南丁格尔玫瑰图)——Python热狗大胃王比赛数据集

【实验名称】 实验一&#xff1a;时间数据的可视化 【实验目的】 1.掌握时间数据在大数据中的应用 2.掌握时间数据可视化图表表示 3. 利用python程序实现堆叠柱形图的可视化 【实验原理】 时间是一个非常重要的维度与属性。时间序列数据存在于社会的各个领域&#xff0c;如&a…

【Power Query】List.Select 筛选列表

List.Select 筛选列表 ——在列表中返回满足条件的元素 List.Select(列表,判断条件) 不是列表的可以转成列表再筛选&#xff0c;例如 Record.ToList 不同场景的判断条件参考写法 (1)单条件筛选 列表中小于50的数字 List.Select({1,99,8,98,5},each _<50) (2)多条件筛…

高低温探针台的工作原理及其构造

高低温探针台是一种用于材料科学、物理、化学等领域的实验设备&#xff0c;主要用于在高温和低温环境下对材料进行各种实验和研究。 高低温探针台的工作原理是将样品放置在加热和冷却组件上&#xff0c;然后使用各种测量仪器对其进行实验和测量。具体来说&#xff0c;其工作流程…

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持UDP和TCP传输协议

随着科技的飞速发展&#xff0c;视频技术已成为现代社会不可或缺的一部分&#xff0c;广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。在这一背景下&#xff0c;NVR管理平台EasyNVR作为一款高效、灵活的视频监控管理系统&#xff0c;正经历着前所未有的发展机遇…

iOS 本地存储地址(位置)

前言: UserDefaults 存在沙盒的 Library --> Preferences--> .plist文件 CoreData 存在沙盒的 Library --> Application Support--> xx.sqlite 一个小型数据库里 (注:Application Support 这个文件夹已开始是没有的,只有当你写了存储代码,运行之后,目录里才会出…

MT-Pref数据集:包含18种语言的18k实例,涵盖多个领域。实验表明它能有效提升Tower模型在WMT23和FLORES基准测试中的翻译质量。

2024-10-10&#xff0c;由电信研究所、里斯本大学等联合创建MT-Pref数据集&#xff0c;它包含18种语言方向的18k实例&#xff0c;覆盖了2022年后的多个领域文本。通过在WMT23和FLORES基准测试上的实验&#xff0c;我们展示了使用MT-Pref数据集对Tower模型进行对齐可以显著提高翻…

C++list

1.迭代器的功能以及性质 功能有iterator&#xff0c;reverse_iterator&#xff0c;const_iterator&#xff0c;const_reverse_iterator 性质有单向&#xff0c;双向和随机&#xff0c;单向的迭代器只能操作&#xff0c;双向只能/--俩种&#xff0c;随机则可以执行/--//-的操作…

【C++篇】栈的层叠与队列的流动:在 STL 的韵律中探寻数据结构的优雅之舞

文章目录 C 栈与队列详解&#xff1a;基础与进阶应用前言第一章&#xff1a;栈的介绍与使用1.1 栈的介绍1.2 栈的使用1.2.1 最小栈1.2.2 示例与输出 1.3 栈的模拟实现 第二章&#xff1a;队列的介绍与使用2.1 队列的介绍2.2 队列的使用2.2.1 示例与输出 2.3 队列的模拟实现2.3.…

[快速阅读八] Matlab中bwlookup的实现及其在计算二值图像的欧拉数、面积及其他morph变形中的应用。...

以前看过matlab的bwlookup函数&#xff0c;但是总感觉有点神秘&#xff0c;一直没有去仔细分析&#xff0c;最近在分析计算二值图像的欧拉数时&#xff0c;发现自己写的代码和matlab的总是对不少&#xff0c;于是又去翻了下matlab的源代码&#xff0c;看到了matlab里实现欧拉数…

JS轮播图实现自动轮播、悬浮停止轮播、点击切换,下方指示器与图片联动效果

代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

计算机网络原理总结C-网络层

网络层 网络层提供的两种服务网际协议IP 虚拟互连网络IP地址子网掩码&#xff08;无分类编址CIDR&#xff09;IP地址和MAC地址IP数据报格式&#xff08;路由&#xff09;转发分组的流程 因特网的路由选择协议&#xff08;动态路由协议&#xff09; 网际控制报文协议ICMPIP多播…

麒麟v10 arm64 部署 kubesphere 3.4 修改记录

arm64环境&#xff0c;默认安装 kubesphere 3.4 &#xff0c;需要修改几个地方的镜像&#xff0c;并且会出现日志无法显示 1 fluentbit:v1.9.4 报错 <jemalloc>: Unsupported system page size Error in GnuTLS initialization: ASN1 parser: Element was not found. &…

Java最全面试题->数据库/中间件->Redis面试题

文章目录 Redisredis的数据类型有哪些?Redis 内部结构有哪些?Memcache 与 Redis 的区别都有哪些?为什么 redis 需要把所有数据放到内存中?Redis 如何进行持久化?RDB和AOF的优缺点有哪些?什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?redis的淘汰策略有哪些?Red…

用更多的钱买电脑而不是手机

如果&#xff0c;我们对自己的定义是知识工作者&#xff0c;那么在工作、学习相关的电子设备投入上&#xff0c;真的别舍不得花钱。 需要留意的是&#xff0c;手机&#xff0c;对于大部分在电脑前工作的人&#xff0c;不是工作设备。在我看来&#xff0c;每年投入到电脑的钱&…

【高级IO】IO多路转接之select

select函数 我们知道IO 等待 拷贝&#xff0c;系统提供select函数来实现多路复用输入/输出模型&#xff1b;select系统调用是用来让我们的程序监视多个文件描述符的状态变化的&#xff1b;程序会停在select这里等待&#xff0c;直到被监视的文件描述符有一个或多个发生了状态…

植物健康,Spring Boot来助力

3系统分析 3.1可行性分析 通过对本植物健康系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本植物健康系统采用SSM框架&#xff0c;JAVA作为开发语言&#…