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

简介

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

Func委托

说明

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

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

原型如下所示:

csharp 复制代码
public delegate TResult Func<in T,out TResult>(T arg);

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

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

示例

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

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

c 复制代码
Func<string, string> selector;

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

ini 复制代码
 selector= str => str.ToUpper();

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

ini 复制代码
 Func<string, string> selector = str => str.ToUpper();

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

调用这个委托对象:

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

结果如下所示:

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

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

输出结果如下所示:

其实是一样的。

查看select方法说明:

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

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

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

Action委托

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

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

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

csharp 复制代码
public delegate void Action<in T>(T obj);

它的图解如下所示:

示例

声明委托类型的变量:

c 复制代码
Action<string> action;

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

ini 复制代码
void showMessage(string message)
{
    Console.WriteLine(message);
}
action = showMessage;

但是一般可以合为一步:

typescript 复制代码
Action<string> action = showMessage;
​
void showMessage(string message)
{
    Console.WriteLine(message);
}         

调用委托:

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

输出结果如下所示:

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

ini 复制代码
 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);
     }
 }

输出结果如下所示:

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

ref

Action Delegate (System) | Microsoft Learn

Func Delegate (System) | Microsoft Learn

相关推荐
泛凡(Linyongui)1 天前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
暴走约伯1 天前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
信息安全失业大专人员1 天前
每日了解一个智能体-WorkBuddy
开发语言·ai·c#·智能体
呆呆敲代码的小Y1 天前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
淡海水1 天前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
椒颜皮皮虾྅1 天前
让 C# 读懂整张图:DeploySharp 驱动 PaddleOCR v4/v5/v6,打通 OCR 全流程
开发语言·人工智能·深度学习·学习·c#·ocr·cuda
昂好的day1 天前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
吃一碗粉只付一碗钱2 天前
12-给SPA友好的401和403响应
c#·状态模式
caimouse2 天前
MonoDevelop 编译用户应用程序时调用的是哪个编译器
c#
will_net2 天前
apollo 站点部署&C#接入
开发语言·c#·apollo