首页 > 编程语言 >C#中内置的泛型委托Func与Action

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

时间:2023-12-04 21:33:38浏览次数:117  
标签:string 委托 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<T>这种形式来说明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

标签:string,委托,C#,泛型,所示,Func,Action
From: https://www.cnblogs.com/mingupupu/p/17876044.html

相关文章

  • ThreadLocal的深度解读
    原文链接:https://zhuanlan.zhihu.com/p/624851777一、J2SE的原始描述Thisclassprovidesthread-localvariables.Thesevariablesdifferfromtheirnormalcounterpartsinthateachthreadthataccessesone(viaitsgetorsetmethod)hasitsown,independentlyin......
  • 2023ICCV_FSI Frequency and Spatial Interactive Learning for Image Restoration in
     三.Network 1.  2.FLB:没看懂是怎么分离的水平和竖直方向 3.SLB:每一层保留一半的通道特征用于细化,其余的在特征重构后输出(没看懂)。Multi-distillationNetwork 超分辨网络的Multi-distillationNetwork(2019ACMMM_LightweightImageSuper-ResolutionwithIn......
  • Django和sqlite3版本不匹配解决 Django-django.core.exceptions.ImproperlyConfigured
    1.修改django源文件配置2升级sqlite下载sqlite3wgethttps://www.sqlite.org/2019/sqlite-autoconf-3270200.tar.gz 解压并安装sqlite3tar-zxvfsqlite-autoconf-3270200.tar.gzcdsqlite-autoconf-3270200./configure--prefix=/usr/localmake&&makeinstall......
  • 远程网关XD-K30S—实现PLC无线远程通信技术
    远程网关XD-K30S—实现PLC无线远程通信技术XD-K30S远程网关技术具有一系列的特点和优势。首先,它支持多种协议的数据传输,包括Modbus、CAN、TCP/IP等,可以方便地与各种PLC设备进行集成。其次,该技术非常稳定可靠,可实现24小时持续运行,提供了高效的远程控制和数据采集手段。XD-K30S远......
  • CF1833G Ksyusha and Chinchilla 题解
    题意:思路:当$n\not\equiv0\space(mod\space3)$时,无解;当$n\equiv0\space(mod\space3)$时,设$size_u$表示以$u$为根的子树还剩余的节点个数,自根节点向叶子节点递归,返回时进行处理节点$u$:设节点$u$的子节点为长度为$len$的序列$v$,设......
  • CF55D Beautiful numbers
    题意给定序列\(S\)。求满足以下性质的\(S\)的排列的数量:\(\max_{j=1}^{i-1}s_j\ge2\timess_i\)或\(\max_{j=1}^{i-1}2\timess_j\les_i\)。Sol排个序先。设\(f_i\)表示我们从小到大往\(s\)里面填数,现在填的最大值为\(s_i\)的方案数。不难......
  • [Educational Codeforces Round 159 (Rated for Div. 2)](https://codeforces.com/con
    EducationalCodeforcesRound159(RatedforDiv.2)好困,差点没打A-BinaryImbalance#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;voidsolve(){ strings; intn; cin>>n; cin>>s; if(n==......
  • 内存管理相关概念 (翻译 by chatgpt)
    原文:https://www.kernel.org/doc/html/latest/admin-guide/mm/concepts.htmlThememorymanagementinLinuxisacomplexsystemthatevolvedovertheyearsandincludedmoreandmorefunctionalitytosupportavarietyofsystemsfromMMU-lessmicrocontrollerst......
  • 使用 PyTorch 完全分片数据并行技术加速大模型训练
    本文,我们将了解如何基于PyTorch最新的完全分片数据并行(FullyShardedDataParallel,FSDP)功能用Accelerate库来训练大模型。动机......
  • [PA2021] Poborcy podatkowi
    令\(dp_{x,d}\)表示\(x\)子树内现在根结点上挂着的链的长度为\(d\)的最大收益,那么转移时只要考虑一个点的子节点如何进行合并,注意到只有\(1,3\)消,\(2,2\)消两种互消的\(\text{case}\),相当于转移相当于\(\text{fix}\)\(a-c=d_{1}(|d_{1}|\leqslant1)\)且\(b\)\(\te......