首页 > 编程语言 >学习 C# 中的 Action 和 Func 委托

学习 C# 中的 Action 和 Func 委托

时间:2024-06-21 12:00:22浏览次数:9  
标签:委托 C# void static Func Action public

介绍

在 C# 中,委托是一种强大的工具,它使方法能够作为参数传递。最常用的两种委托类型是 Action 和 Func。这些通用委托通过为常见场景提供内置类型来简化委托的使用。本文探讨 Action 和 Func 委托、它们的区别以及如何有效使用它们的实际示例。

Action委托

Action 委托表示执行操作但不返回值的方法。它可以采用零个或多个参数。

句法

public delegate void Action();
public delegate void Action<T>(T arg);
public delegate void Action<T1, T2>(T1 arg1, T2 arg2);
// 最多16个参数

例子

using System;
public class ActionExample
{
    public static void PrintMessage()
    {
        Console.WriteLine("Hello, World!");
    }

    public static void PrintNumber(int number)
    {
        Console.WriteLine($"Number: {number}");
    }
    public static void Main()
    {
        Action action = PrintMessage;
        action();
        Action<int> actionWithParam = PrintNumber;
        actionWithParam(42);
    }
}

在这个例子中,PrintMessage 和 PrintNumber 是与 Action 委托签名相匹配的方法。Action 委托封装了这些方法并允许通过委托实例调用它们。

Func委托

Func委托用于表示返回值的方法。它可以采用零个或多个参数,但必须返回一个值。

句法

public delegate TResult Func<TResult>();
public delegate TResult Func<T, TResult>(T arg);
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
// 最多16个参数

例子

using System;
public class FuncExample
{
    public static int GetNumber()
    {
        return 42;
    }
    public static string ConcatenateStrings(string str1, string str2)
    {
        return str1 + str2;
    }
    public static void Main()
    {
        Func<int> func = GetNumber;
        int result = func();
        Console.WriteLine($"Result: {result}");
        Func<string, string, string> funcWithParams = ConcatenateStrings;
        string concatenated = funcWithParams("Hello, ", "World!");
        Console.WriteLine($"Concatenated: {concatenated}");
    }
}

在此示例中,GetNumber 和 ConcatenateStrings 是与 Func 委托签名匹配的方法。Func 委托封装了这些方法并允许通过委托实例调用它们。

Action 和 Func 之间的区别

Action 和 Func 委托之间的主要区别在于它们的返回类型。

  • Action:表示没有返回值(void)的方法。
  • Func:表示返回值的方法。

实际用途

委托(包括 Action 和 Func)通常用于事件处理、回调方法以及作为对集合执行操作的方法的参数。

示例。在列表操作中使用 Action 和 Func。

using System;
using System.Collections.Generic;
public class ListOperationExample
{
    public static void PerformActionOnList<T>(List<T> list, Action<T> action)
    {
        foreach (var item in list)
        {
            action(item);
        }
    }
    public static List<TResult> TransformList<T, TResult>(List<T> list, Func<T, TResult> func)
    {
        var resultList = new List<TResult>();
        foreach (var item in list)
        {
            resultList.Add(func(item));
        }
        return resultList;
    }
    public static void Main()
    {
        var numbers = new List<int> { 1, 2, 3, 4, 5 };
        PerformActionOnList(numbers, n => Console.WriteLine($"Number: {n}"));
        var doubledNumbers = TransformList(numbers, n => n * 2);
        PerformActionOnList(doubledNumbers, n => Console.WriteLine($"Doubled Number: {n}"));
    }
}

在此示例中,PerformActionOnList 采用 Action 对列表中的每个项目进行操作,而 TransformList 采用 Func<T, TResult> 来转换列表中的每个项目并返回一个新列表。

结论

Action 和 Func 委托是 C# 中必不可少的工具,它们允许将方法作为参数传递,从而实现更灵活、更可重用的代码。了解它们的区别以及如何使用它们可以大大提高您编写简洁高效的 C# 程序的能力。通过利用这些委托,您可以创建更抽象、更高级的方法,这些方法可对各种数据类型和操作进行操作。

标签:委托,C#,void,static,Func,Action,public
From: https://blog.csdn.net/xiefeng240601/article/details/139827774

相关文章

  • 在 C# 中对比KeyValuePair<TKey, TValue> 和 IDictionary<TKey, TValue>
    C#中的KeyValuePair<TKey,TValue>和IDictionary<TKey,TValue>具有独特的用途并表现出不同的特征。KeyValuePair<TKey,TValue>的功能KeyValuePair<TKey,TValue>是存储单个键值对的数据结构。它属于System.Collections.Generic命名空间。用法它用于表示单个......
  • C语言中的strtok()函数
    strtok()函数是C标准库<string.h>头文件的一部分,用于将字符串分割成一个个标记(token)。语法#include<string.h>char*strtok(char*string,constchar*delimiter);string:要分割的输入字符串。delimiter:分隔符字符串。strtok()函数将根据分隔符字符将输入字符串......
  • Modbus协议转Profibus协议网关接温控表与PLC通讯
    Modbus协议转Profibus协议网关接温控表与PLC通讯一、前言在智能化飞速发展的时代,各个行业都在使用自动化系统。在智能楼宇系统中,温控表和PLC(可编程逻辑控制器)通讯是至关重要的,在智能楼宇系统中,温控表起着监测和控制室内温度的重要作用。而PLC作为控制中心,负责接收温控表传输的数......
  • SSL/TLS协议信息泄露漏洞(CVE-2016-2183)
    1.问题描述SSL/TLS协议信息泄露漏洞(CVE-2016-2183)TLS是安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性。TLS,SSH,IPSec协商及其他产品中使用的DES及TripleDES密码存在大约四十亿块的生日界,这可使远程攻击者通过Sweet32攻击,获取纯文本数据。2.问题解决......
  • WPF/C#:数据绑定到方法
    在WPFSamples中有一个关于数据绑定到方法的Demo,该Demo结构如下:运行效果如下所示:来看看是如何实现的。先来看下MainWindow.xaml中的内容:<Window.Resources><ObjectDataProviderObjectType="{x:Typelocal:TemperatureScale}"MethodName="Con......
  • 重磅!2024年最新影响因子正式发布,附Excel下载
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。激动人心的时刻终于来了,2024年影响因子已全面发布!废话不多说,大家一起来看看最新的发布的结果吧!神刊:CA-ACANCERJOURNALFORCLINICIANS毫无疑问,最高分必然是它,今年公布最新影响因子为503.1。四大医学期刊NEJM、T......
  • Modbus协议ASCII模式下数据的LRC校验
          Modbus协议ASCII模式下数据的LRC校验,计算校验时不包括开头的冒号字符,从第2个字符开始。计算LRC时先将原始的ASCII码格式的数据转换为HEX(ASCII码格式数据‘F’转换为0x0F);在将转换后的HEX数据按照高半字节在前低半字节在后的顺序(如a[1]=0x0F,a[2]=0x0A,合并后的数......
  • JavaScript async await 使用
    你习惯在js代码中使用asyncawait吗?我经常在js代码中写一些异步方法,使用await调用的地方,如果方便修改成异步方法,就修改成异步方法,如下所示:asyncsetPosition(graphic,lng,lat){this.lng=lng;this.lat=lat;if(graphic){letheight=awaitgetHeightByLng......
  • Tcp粘包半包问题(现实场景举例帮助理解)
    理解粘包问题时,我们可以将这个过程想象得更加生活化一些。想象你正在经营一家水果拼装店,你的任务是接收来自不同客户的水果订单,并将这些水果按照订单要求重新组装起来。每份订单中的水果都事先被切成了便于快递的“水果片”,并通过同一条传送带送过来。现在,你收到了两份订单,一......
  • 关于Echarts的简单基础用法
    首先我们需要去官网:ApacheECharts找到我们需要的图表如图下:2.在使用之前我们需要获取所需的npmnpminstallecharts3.这时我们需要新建一个 index.html 文件<!DOCTYPEhtml><html><head><metacharset="utf-8"/><!--引入刚刚下载的ECharts文件-->......