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

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

C# Hash算法之MD5、SHA

MD5我们用的还是比较多的,一般用来加密存储密码。但是现在很多人觉MD5可能不太安全了,所以都用上了SHA256等来做加密(虽然我觉得都差不多,MD5还是能玩)。 还是跟上一篇说的一样,当一个算法的复杂度提高的同时肯定会带来效率的降低,所以SHA和MD5比较起来的话,SHA更安全,MD5更高效。 由于HASH算法的不可逆性,所以我认为MD5和SHA主要还是应用在字符串的"加密"上。 由于

Python 内置的一些数据结构

文章目录 1. 列表 (List)2. 元组 (Tuple)3. 字典 (Dictionary)4. 集合 (Set)5. 字符串 (String) Python 提供了几种内置的数据结构来存储和操作数据,每种都有其独特的特点和用途。下面是一些常用的数据结构及其简要说明: 1. 列表 (List) 列表是一种可变的有序集合,可以存放任意类型的数据。列表中的元素可以通过索

Unable to instantiate Action, goodsTypeAction, defined for 'goodsType_findAdvanced' in namespace '/

报错: Unable to instantiate Action, goodsTypeAction,  defined for 'goodsType_findAdvanced' in namespace '/'goodsTypeAction......... Caused by: java.lang.ClassNotFoundException: goodsTypeAction.......