C#中内置的泛型委托Func与Action

2023-12-05 08:52

本文主要是介绍C#中内置的泛型委托Func与Action,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

从C# 3.0起很少需要自己声明委托。System.Func 是一个泛型委托,它可以表示带有返回值的方法。它可以接受一个到多个输入参数,并返回一个指定类型的结果。System.Func 委托的最后一个类型参数表示方法的返回值类型。而System.Action系列代表返回void的方法。

Func委托

说明

Func委托有很多种形式,如下所示:

image-20231204102101852

这里以Func<T,TResult>为例说明该委托的用法。

原型如下所示:

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

结合前面文章委托(一)中对于委托类型的图解:

image-20231204102840797

那么这个内置泛型委托的图解如下:

image-20231204103628924

示例

依据前面的文章委托(一)中使用委托的步骤来说明这个内置泛型委托的用法:

image-20231204104212396

由于这个是内置的泛型委托,包含在System.Runtime.dll程序集中,不是自定义的委托类型,因此不需要自己声明这个委托类型,而是声明这个泛型委托变量:

Func<string, string> selector;

然后创建委托实例,并添加第一个方法:

 selector= str => str.ToUpper();

这里使用了lambda表达式,以后再进行解释。这里将声明委托变量与实例化分开了,一般可以将这两个步骤合并,如下所示:

 Func<string, string> selector = str => str.ToUpper();

这个委托对象的图解如下所示:

image-20231204105435571

调用这个委托对象:

 string[] words = { "orange", "apple", "Article", "elephant" };IEnumerable<String> aWords = words.Select(selector);foreach (String word in aWords)Console.WriteLine(word);

结果如下所示:

image-20231204105821302

其实也可以直接在select中直接写一个lambda表达式,这种方式更常见:

string[] words = { "orange", "apple", "Article", "elephant" };IEnumerable<String> aWords = words.Select(x => x.ToUpper());foreach (String word in aWords)Console.WriteLine(word);

输出结果如下所示:

image-20231204110124627

其实是一样的。

查看select方法说明:

image-20231204110332929

它的参数类型就是一个参数类型为string返回值类型为string的内置func委托类型。

Lambda表达式的类型是由编译器隐式推断的,它通常表示为委托类型或表达式树类型,具体取决于上下文。最常见的用法是将Lambda表达式赋值给委托类型或传递给接受委托类型参数的方法。

以上就是C#中的内置泛型委托func的介绍与用法示例,希望对你有所帮助。

Action委托

Action委托也有很多形式,如下所示:

image-20231204144408398

本文以Action这种形式来说明C#中内置的泛型Action委托的用法。

该委托类型的原型如下所示:

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

它的图解如下所示:

image-20231204144848357

示例

声明委托类型的变量:

Action<string> action;

实例化该委托变量,即为委托添加方法:

void showMessage(string message)
{Console.WriteLine(message);
}
action = showMessage;

但是一般可以合为一步:

Action<string> action = showMessage;void showMessage(string message)
{Console.WriteLine(message);
}         

调用委托:

string[] words = { "orange", "apple", "Article", "elephant" };
foreach(var word in words) 
{ action(word);
}

输出结果如下所示:

image-20231204150654969

但是可以发现我们的代码写的还不构简洁,用到了另外声明的方法,其实可以用Lambda表达式来写方法,不需要自己另外写:

 static void Main(string[] args){Action<string> action = (x) => {Console.WriteLine(x);};string[] words = { "orange", "apple", "Article", "elephant" };foreach(var word in words) { action(word);}}

输出结果如下所示:

image-20231204151506648

以上就是C#中的内置泛型委托Action的介绍与用法示例,希望对你有所帮助。

ref

Action Delegate (System) | Microsoft Learn
Func Delegate (System) | Microsoft Learn

这篇关于C#中内置的泛型委托Func与Action的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/456920

相关文章

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹