C#关于Func和Action委托的介绍详解

C#关于Func和Action委托的介绍详解

什么是委托

委托是一种可以存储并引用方法的数据类型。换句话说,委托使得我们可以把一个方法作为参数传递给另一个方法或者把一个方法存储在一个变量中。

在C#中,我们可以使用delegate关键字来定义一个委托类型。委托类型的定义和方法的定义类似,但是没有方法体。例如:

delegate void MyDelegate(int x);

定义了一个名为MyDelegate的委托类型,该委托类型可以接受一个int类型参数,并且不返回任何值。

Action委托

在C#中,有两种常用的委托类型:ActionFunc。其中,Action委托表示不返回任何值的方法,也可以看做是一个没有参数和返回值的委托。

Action委托没有返回值,因此不能用于需要返回值的方法。例如:

void MyMethod(int x)
{
    Console.WriteLine($"MyMethod received {x}.");
}

Action<int> myAction = new Action<int>(MyMethod);
myAction(42);

上面的代码定义了一个Action<int>类型的委托myAction,其参数类型为int,并将其初始化为一个指向方法MyMethod的委托。随后,我们可以通过myAction(42)来调用MyMethod方法并传递参数42。

Func委托

Func委托表示一个带有返回值的方法,且最后一个泛型参数表示方法的返回类型。例如:

int MyMethod(int x)
{
    return x * 2;
}

Func<int, int> myFunc = new Func<int, int>(MyMethod);
Console.WriteLine(myFunc(5)); //输出10

上面的代码定义了一个Func<int, int>类型的委托myFunc,其第一个泛型参数表示方法的参数类型,第二个泛型参数表示方法的返回类型,并将其初始化为一个指向方法MyMethod的委托。随后,我们可以通过myFunc(5)来调用MyMethod方法并传递参数5,并输出返回的结果10。

示例1:将委托作为方法参数

下面的代码示例演示了如何将一个委托作为方法参数,并在方法中调用该委托。

void MyMethod(int x, Action<int> myAction)
{
    Console.WriteLine($"MyMethod received {x}.");
    myAction(x);
}

void PrintInt(int x)
{
    Console.WriteLine($"The input value is {x}.");
}

MyMethod(42, new Action<int>(PrintInt));

上面的代码中,MyMethod方法接受两个参数:一个整数类型的参数和一个Action<int>类型的委托。在方法中,我们先输出了传入的整数参数,然后调用了传入的myAction委托。随后,我们调用MyMethod方法并传递了一个整数42以及一个指向PrintInt方法的委托。

示例2:使用Lambda表达式创建委托

下面的代码示例演示了如何使用Lambda表达式来创建一个委托。

Func<int, int> myFunc = x => x * 2;
Console.WriteLine(myFunc(5)); //输出10

上面的代码中,我们定义了一个Func<int, int>类型的委托myFunc,利用Lambda表达式的形式指定myFunc所代表的方法,并将Lambda表达式赋值给myFunc。随后,我们可以通过myFunc(5)来调用Lambda表达式中定义的方法,并输出返回的结果10。

结论

在C#中,委托是一种常用的数据类型,可以把一个方法作为参数传递给另一个方法或者把一个方法存储在一个变量中。Action委托表示不返回任何值的方法,Func委托则表示一个带有返回值的方法。还可以使用Lambda表达式来方便地创建委托。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#关于Func和Action委托的介绍详解 - Python技术站

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

相关文章

  • .NET应用程序集DLL与EXE工作机制及原理介绍

    下面是详细讲解“.NET应用程序集DLL与EXE工作机制及原理介绍”的完整攻略。 一、简介 .NET应用程序集是指在.NET平台下开发的一种可复用的代码和资源的集合,由DLL(动态链接库)和EXE(可执行文件)两种文件类型组成,其中DLL是库文件,EXE是应用程序文件。在.NET中,应用程序的逻辑和业务代码通常是以DLL的形式组织,而实际的应用程序则通过一个…

    C# 2023年6月3日
    00
  • C#信号量用法简单示例

    当我们需要对一个或多个资源进行控制时,可以使用信号量。信号量是一种同步原语,它可以被用来跟踪资源的可用性。在这篇文章中,我们将会讲解C#中的信号量用法,包括信号量的基本操作和信号量用法的示例。 基本用法 在C#中,信号量可以通过System.Threading命名空间的Semaphore类来实现。Semaphore类封装了Windows内核对象,可以根据需要…

    C# 2023年5月15日
    00
  • C#操作Windows服务类System.ServiceProcess.ServiceBase

    C#操作Windows服务需要使用System.ServiceProcess.ServiceBase类。下面是使用这个类的完整攻略。 ServiceBase类 ServiceBase类是用于开发Windows服务的基类,它提供了操作Windows服务的方法和属性。 安装/卸载服务 安装Windows服务需要使用InstallUtil.exe工具,在Visua…

    C# 2023年6月7日
    00
  • C# DataTable数据遍历优化详解

    当处理大数据量的DataTable时,常常需要考虑优化数据遍历的性能,这里将介绍一些优化技巧来提高C#的DataTable遍历速度。 1. 使用索引来提高DataTable遍历性能 使用索引是数据检索的一种高效方式。在DataTable中使用PrimaryKey,可以基于每个列的唯一值来创建索引。通过使用PrimaryKey,可以遍历DataRow的速度被大…

    C# 2023年5月31日
    00
  • C#商品管理系统简易版

    C#商品管理系统简易版攻略 1. 基础准备 安装Visual Studio:在官网上下载 Visual Studio 安装包,按照提示进行安装即可。 掌握C#基础语法:熟悉C#关键词、变量类型、循环语句、条件语句等基础语法,在基础上可以更好地理解代码的实现逻辑。 2. 搭建初始界面 在 Visual Studio 中创建一个 Windows Form 应用程…

    C# 2023年6月7日
    00
  • C#入参使用引用类型要加ref的原因解析

    C#中,我们可以将变量传递给方法,以便在方法内部使用。但是在使用引用类型作为参数时,我们需要使用关键字ref。那么为什么要这么做呢?接下来就进行详细讲解。 1. 值类型和引用类型的区别 在开始解释原因之前,我们必须要先理解值类型和引用类型的不同之处。在C#中,值类型包括int、double、bool等基本数据类型,而引用类型则包括string、object和…

    C# 2023年6月1日
    00
  • Winform下实现图片切换特效的方法

    首先我们需要明确一下,Winform是一个Windows桌面应用程序,为了实现图片切换特效,我们需要使用C#编写程序,下面是实现图片切换特效的方法: 1. 准备工作 在 Visual Studio 中创建一个 Winform 应用程序项目,然后在主窗体中添加一个 Picturebox 控件,用于展示图片切换效果。 2. 加载图片资源 为了实现图片切换特效,我…

    C# 2023年6月7日
    00
  • c# 使用Task实现非阻塞式的I/O操作

    下面是详细讲解“c# 使用Task实现非阻塞式的I/O操作”的完整攻略。 简介 在进行I/O操作时,如果我们在单线程中进行了阻塞式I/O操作,那么在I/O等待时间内,该线程无法执行其他操作,导致I/O操作效率极低。因此,我们需要使用非阻塞的I/O操作,使得I/O操作的等待时间内能够执行其他操作,提高操作效率。 Task是.Net Framework和.Net…

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