浅谈C#中Action和Func回调的常用方式

下面是详细讲解“浅谈C#中 Action 和 Func 回调的常用方式” 的完整攻略。

什么是回调函数

回调函数是一种常见的程序设计模式,用于将一个函数作为参数传递给另一个函数。在调用这个另一个函数时,它将执行传递的函数作为一部分操作。这种方法被称为“回调”功能。

C# 中的回调

C# 中的回调是通过委托实现的。一个委托是一个类型,它持有对一个或多个方法的引用。委托中的方法可以是 static、non-static 或 lambda 表达式。委托是 C# 中的“可调用对象”,它们可以像方法一样被调用并执行其关联的方法。

Action 委托

Action 是一个预定义的委托类型,它没有返回值。它可以用来引用没有参数和没有返回值的方法。

Action 委托的声明

public delegate void Action();

Action 委托的使用

示例 1

假设我们有一个方法 SendMessage,用于向服务器发送消息,而我们想在这个方法之前和之后执行某些代码。我们可以使用如下代码进行操作:

Action before = () => Console.WriteLine("Before sending message.");
Action after = () => Console.WriteLine("After sending message.");

SendMessage(before, after);

private static void SendMessage(Action before, Action after)
{
    before?.Invoke();

    // Send message

    after?.Invoke();
}

这里我们通过把委托传递给 SendMessage 方法来实现回调功能。在方法执行之前和之后,分别调用了我们传递的两个委托。

示例 2

假设我们需要对一个列表中的每个元素执行同一个方法 DoSomething。我们可以使用如下代码:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

Action<int> action = n => Console.WriteLine($"The square of {n} is {n * n}");

numbers.ForEach(action);

这里我们需要使用 Action<int> 委托,它有一个整数类型的参数,并且没有返回值。我们将一个 lambda 表达式赋值给 action 变量,然后将其传递给列表的 ForEach 方法。ForEach 方法将列表中的每个元素作为参数传递给 lambda 表达式,最终将其输出到控制台。

Func 委托

Func 是 C# 中另一个预定义的委托类型,它具有一个返回值和一个或多个参数。在 Func 中的最后一个参数是返回值类型,其余的参数是输入参数。

Func 委托的声明

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

Func 委托的使用

示例 1

假设我们有一个方法 Add,它可以将两个数字相加并返回结果。我们可以使用如下代码进行操作:

Func<int, int, int> add = (a, b) => a + b;

int result = add(1, 2);

这里我们使用 Func<int, int, int> 委托来调用 Add 方法,它有两个整数类型的参数,并返回一个整数类型的结果。我们将一个 lambda 表达式赋值给 add 变量,并将其传递给方法。最后,我们将它的结果保存在一个变量中。

示例 2

假设我们需要找到一个列表中的最大值。我们可以使用如下代码:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

Func<int, int, int> max = (a, b) => a > b ? a : b;

int maxNumber = numbers.Aggregate(max);

这里我们使用 Func<int, int, int> 委托来调用 Aggregate 方法,它需要一个 lambda 表达式作为参数。传递给 Aggregate 方法的委托有两个整数类型的参数,并返回一个整数类型的结果。该方法将在列表中对两个元素执行该委托,返回结果后在列表中继续执行该方法,直到返回最终结果。在这个例子中,我们使用了一个 lambda 表达式来比较两个数字,找到列表中的最大值。

小结

这篇文章讨论了 C# 中的回调函数,介绍了 Action 和 Func 委托类型的使用和声明,提供了使用这些委托类型的示例。使用回调可以让我们在程序中更好地控制流程,而委托则是实现回调的常见方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈C#中Action和Func回调的常用方式 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 浅析C#更改令牌ChangeToken

    浅析C#更改令牌ChangeToken 什么是ChangeToken ChangeToken是ASP.NET Core框架中的一个关键抽象,是用来告诉缓存或联接等系统何时应该使其存储的数据过期并重新生成的一种机制。它可以被用于许多场景,例如:文件缓存、分布式缓存、Razor导航等等。 ChangeToken以观察者模式的方式工作,即我们的应用程序会订阅一个C…

    C# 2023年6月1日
    00
  • C#在新建线程中使用Timer无效问题及解决

    当我们在C#中创建新线程时,如果需要在该线程中使用定时器(Timer),可能会遇到定时器无效的问题。这是由于定时器只能在主线程中工作的限制所造成的。在本文中,我们将详细讲解如何避免这个问题,并给出两个示例。 问题的原因 在C#中,System.Threading.Timer是一个线程安全的定时器,可用于重复性操作和单次操作。但是,它的设计是基于CLR线程池,…

    C# 2023年5月15日
    00
  • ASP.NET Core通过Microsoft.AspNetCore.App元包简化程序集引用

    ASP.NET Core通过Microsoft.AspNetCore.App元包简化程序集引用攻略 在ASP.NET Core 2.1版本中,Microsoft引入了Microsoft.AspNetCore.App元包,它包含了许多常用的ASP.NET Core组件和库,可以简化程序集引用。在本攻略中,我们将提供一些有用的提示和技巧,以帮助您使用Micros…

    C# 2023年5月16日
    00
  • 关于C# dynamic装箱问题

    这里是关于C# dynamic装箱问题的完整攻略: 什么是C#装箱和拆箱 C#装箱和拆箱是指将值类型转换为引用类型,以及将引用类型转换为值类型的过程。在C#中,值类型是指整数、浮点数、字符等基本数据类型,而引用类型是指静态类型、类实例、数组对象等。 C#装箱和拆箱的问题 在C#中,对于动态类型dynamic,其底层是以object表示的。而对于值类型的dyn…

    C# 2023年5月14日
    00
  • Asp.net后台调用js 2种方法

    Asp.net后台调用js一般采用以下两种方法: 1. 注册js脚本 在后台代码中,通过Page.RegisterStartupScript方法注册js脚本。具体流程如下: string script = "<script>alert(‘Hello World!’)</script>"; // js脚本 Page.…

    C# 2023年5月31日
    00
  • C#控制台应用程序中输出彩色字体

    要在C#控制台应用程序中输出彩色字体,可以使用ANSI转义序列,通过将一些特殊的控制字符写入到控制台输出流中,来实现对文本颜色和其他属性的设置。以下是具体的步骤: 第一步:为输出流启用支持ANSI转义序列 在使用ANSI转义序列之前,需要为控制台输出流启用支持这些序列的标志。实现方式如下: // 启用ANSI转义序列支持: Console.OutputEnc…

    C# 2023年6月7日
    00
  • C# Redis学习系列(一)Redis下载安装使用

    C# Redis学习系列(一)Redis下载安装使用 下载 Redis官方网站提供了Windows版的Redis安装包。可以在https://redis.io/download下载最新版本的Redis for Windows。下载后解压缩到任意目录下即可。 安装 Redis并不需要安装过程,我们只需要下载解压缩后,启动redis-server.exe即可。可…

    C# 2023年6月8日
    00
  • asp.net 正则表达式[经常用的到]

    ASP.NET 正则表达式攻略 什么是正则表达式? 正则表达式是一种特殊的字符串模式,它可以帮助我们快速有效地匹配、查找和替换文本中的特定模式,常用于数据验证、字符串处理、搜索引擎等领域。在 ASP.NET 中,我们可以通过内置的 System.Text.RegularExpressions 命名空间来使用正则表达式。 常用的正则表达式元字符和语法 在使用正…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部