浅谈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# datetime 格式化大全

    当涉及到 c# 的 datetime 格式化时,需要了解一些预定义的格式字符串、定界符和格式说明符。 预定义格式字符串 d 使用短日期格式显示日期:“yyyy/MM/dd” D 使用长日期格式显示日期:“yyyy’年’M’月’d’日’” f 使用长日期格式和短时间格式显示日期时间:“yyyy’年’M’月’d’日’ H:mm” F 使用长日期格式和长时间格式显…

    C# 2023年6月1日
    00
  • c#.net 常用函数和方法集

    C#.NET 常用函数和方法集 C#.NET 是一种常用的编程语言,拥有丰富的函数和方法集。在本文中,我们将介绍 C#.NET 常用的函数和方法集,以供开发者在编程过程中参考。 字符串处理 字符串截取 使用 Substring 函数可以实现对字符串的截取。 string str = "Hello, World!"; string subS…

    C# 2023年5月31日
    00
  • Silverlight中动态获取Web Service地址

    下面是关于“Silverlight中动态获取WebService地址”的完整攻略,包含两个示例。 1. Silverlight中动态获取WebService地址 在Silverlight中,我们可以使用ServiceReference标记来引用WebService。但是,有时我们需要动态获取WebService地址,而不是在XAML中硬编码它。以下是在Sil…

    C# 2023年5月15日
    00
  • 如何在C#中使用Dapper ORM

    下面是如何在C#中使用Dapper ORM的完整攻略,包含两个示例说明。 Dapper ORM 简介 Dapper ORM 是 .NET 开发中常用的一个轻量级 ORM 框架,它由 StackExchange 团队在开发 StackOverflow 期间所使用的 ORM 技术衍生而来,旨在提供更快、更简单的数据访问体验。 Dapper ORM 安装 Dapp…

    C# 2023年5月31日
    00
  • C#集合之集(set)的用法

    让我为您详细讲解一下“C#集合之集(set)的用法”。 什么是集(set)? 在C#中,集(set)是一种无序不重复元素的集合。集合是由哈希表实现的,所以集合中的元素是无序的。集合中的每个元素都是唯一的,这意味着同一个元素不会被添加到集合中两次。 集(set)的使用方法 创建集合并添加元素 使用HashSet<T>类可以创建一个集合,并向其中添加…

    C# 2023年6月3日
    00
  • C#把DataTable导出为Excel文件

    关于如何使用C#把DataTable导出为Excel文件,下面是一份详细的攻略: 1. 添加依赖库 使用Excel需要引入Office.dll,如果没有安装Microsoft Office,可以通过NuGet安装Microsoft.Office.Interop.Excel: Install-Package Microsoft.Office.Interop.E…

    C# 2023年5月31日
    00
  • C#自定义鼠标拖拽Drag&Drop效果之基本原理及基本实现代码

    C#自定义鼠标拖拽Drag&Drop效果之基本原理 前言 在很多应用程序中,我们都需要使用拖拽效果来实现某些功能,比如拖拽文件到应用程序窗口中打开等。在C#中,我们可以利用Drag&Drop技术自定义鼠标拖拽的效果,本文将会详细讲解Drag&Drop技术的基本原理及基本实现方法。 基本原理 Drag&Drop技术,即拖放技术,…

    C# 2023年6月6日
    00
  • ASP.NET Core设置Ocelot网关限流

    ASP.NET Core设置Ocelot网关限流 Ocelot是一个基于.NET Core的API网关,它可以帮助我们将多个微服务组合成一个整体的API。在实际应用中,我们可能需要对API网关进行限流,以保证系统的稳定性和可靠性。本攻略将详细介绍如何在ASP.NET Core中使用Ocelot实现API网关限流。 安装Ocelot 首先,我们需要安装Ocel…

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