C# 本地函数与 Lambda 表达式详细介绍

C# 本地函数与 Lambda 表达式详细介绍

在 C# 7.0 中,本地函数(Local Function)成为了新语法糖。本地函数是一种嵌套在方法(函数)中的函数,本地函数通常需要访问外部方法中的局部变量或参数,本地函数也需要遵守访问修饰符的限制。Lambda 表达式是 C# 语言中的另一种语法糖,用于创建可传递的匿名函数。

本地函数

本地函数是一种新语法糖,可以让我们在方法内部定义一个函数。在许多情况下,您可能希望在方法内部声明一个函数来执行一个简单的任务,而不是分离出一个单独的方法来处理这个任务。使用本地函数可以使代码更加清晰。

定义本地函数

定义本地函数时,需要使用关键字local function。下面是一个完整的本地函数示例:

public void PrintNumber(int num)
{
    int GetNextNumber()
    {
        return ++num;
    }

    Console.WriteLine(GetNextNumber()); // 输出11
    Console.WriteLine(num); // 输出10
}

在上面的例子中,我们定义了一个本地函数GetNextNumber,该函数返回参数num的下一个数。本地函数GetNextNumber可以访问外部方法PrintNumber传递的参数num,并能够在本地函数范围内使用。在PrintNumber中,我们依次调用了GetNextNumbernum,输出了它们的值。

访问修饰符

本地函数可以使用和方法相同的访问修饰符:publicprivateprotectedinternalprotected internal。访问修饰符的作用方式和方法相同,可以限制本地函数的可访问性。

本地函数和闭包

在 C# 中,本地函数和闭包都是在方法内部定义的函数,它们都可以访问外部方法中的局部变量和参数。这两种函数有许多相似之处,但是也存在不同之处。

  1. 闭包中的变量在闭包返回后仍然存在,而本地函数中的变量在本地函数返回后就被销毁了。
  2. 本地函数是一个方法的一部分,而闭包是一个独立的表达式。闭包可以传递给其他方法或存储在变量中,而本地函数不能。

Lambda 表达式

Lambda 表达式是 C# 语言中的另一种语法糖,用于创建可传递的匿名函数。Lambda 表达式的使用可以简化代码并提高可读性。

定义 Lambda 表达式

Lambda 表达式定义方式如下:

(parameter_list) => expression

其中,parameter_list指定参数列表,多个参数之间使用逗号分隔,expression表示表达式或语句块。

例如,在下面的示例中,我们使用 Lambda 表达式求和:

Func<int, int, int> Sum = (a, b) => a + b;
Console.WriteLine(Sum(1, 1)); // 输出2

在上面的代码中,我们定义了一个 Func 类型的变量Sum,该类型表示一个带有两个 int 类型参数并返回 int 类型的委托。我们使用 Lambda 表达式重新定义Sum变量,并将其设置为返回两个参数的和。在输出Sum(1, 1)的结果时,会输出 2。

可以省略参数列表和括号

当 Lambda 表达式的参数列表为空时,可以省略参数列表和括号。示例如下:

Func<int> getRandomNumber = () =>
{
    return new Random().Next(1, 100);
};
Console.WriteLine(getRandomNumber()); // 输出一个1到100的随机数

在上面的示例代码中,我们创建了一个getRandomNumber变量,该变量是一个不带参数而返回 int 类型的 Lambda 表达式。在 Lambda 表达式中,我们使用 New() 方法生成一个随机数,并返回这个随机数。

可以省略表达式

当 Lambda 表达式由单个语句组成时,可以省略括号并省略大括号中的语句。示例如下:

Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 输出25

在上面的示例代码中,我们创建了一个square变量,该变量是一个带有 int 类型参数并返回 int 类型的 Lambda 表达式。在 Lambda 表达式中,我们使用一个表达式 u * u,将输入的参数平方后返回。为了使代码更加简洁,我们省略了花括号。

以上就是 C# 本地函数和 Lambda 表达式的详细介绍,希望对你有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 本地函数与 Lambda 表达式详细介绍 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • c#源码的执行过程详解

    c#源码的执行过程详解 1. 源代码编译过程 C#是一种基于CLR(公共语言运行时)的编程语言,它的源代码编译过程分为两个阶段:编译阶段和运行时阶段。 1.1 编译阶段 在C#中,源代码必须先被编译成微软中间语言(MSIL)或CIL(公共中间语言)代码。MSIL代码是CLR的执行代码,它不是本地机器代码,而是被CLR解释执行的代码。因此,编译后的代码可以在任…

    C# 2023年6月1日
    00
  • C#获取某路径文件夹中全部图片或其它指定格式的文件名的实例方法

    要获取某路径文件夹中全部图片或其它指定格式的文件名,我们可以使用C#自带的Directory类中的GetFiles方法。下面是详细的实现方法: 步骤1:引用命名空间 首先我们需要在代码中引用System.IO命名空间,这个命名空间中包含了许多文件和文件夹相关的类。 using System.IO; 步骤2:编写获取文件名的方法 我们将编写的方法命名为GetF…

    C# 2023年6月2日
    00
  • C# Convert.ToInt32()方法: 将指定的值转换为32位有符号整数

    Convert.ToInt32() 是 C# 中将其他数据类型(如 string)转换为 int 类型的方法。它可以将一个对象转换为 32 位带符号整数。如果无法执行转换,则会引发异常。 方法原型 方法原型如下: public static int ToInt32(object value); public static int ToInt32(string…

    C# 2023年4月19日
    00
  • C#多线程TPL常见操作误区与异常处理

    C#多线程TPL常见操作误区与异常处理 前言 随着计算机硬件性能的不断提升,多线程编程已经成为了现代程序设计的重要组成部分。而C#作为现代编程语言之一,它自身所提供的多线程处理库TPL(Task Parallel Library)也变得越来越重要。 然而,TPL虽然极为强大且易于使用,但在使用过程中仍存在一些常见的操作误区和异常情况,如果不注意会给系统带来严…

    C# 2023年5月15日
    00
  • C#和vb.net实现PDF 添加可视化和不可见数字签名

    C# 和 VB.net 都可以使用 iTextSharp 库来实现 PDF 文件添加数字签名。数字签名可以是可视化的,也可以是不可见的。 以下是实现 PDF 添加数字签名的完整攻略: 步骤 1:引入 iTextSharp 库 在项目中引入 iTextSharp 库。通常会从 NuGet 软件包管理器中安装该库,或者从官方网站 https://github.c…

    C# 2023年5月31日
    00
  • 基于C# 写一个 Redis 数据同步小工具

    下面我会详细的介绍“基于C# 写一个 Redis 数据同步小工具”的完整攻略: 简介 Redis是一种基于内存的数据结构存储系统,常用于缓存、消息队列和数据存储等场景。在不同的应用场景中,我们经常需要将 Redis中的数据同步至其他系统。本文将介绍使用C#编写一个Redis数据同步小工具。 安装 Redis 首先需要在本地安装Redis,Redis官网上提供…

    C# 2023年5月31日
    00
  • 如何利用C#正则表达式判断是否是有效的文件及文件夹路径

    C#中正则表达式可以用来匹配、搜索、替换字符串等操作,因此可以用来判断一个字符串是否符合文件或文件夹路径的格式。下面是利用C#正则表达式判断是否是有效的文件及文件夹路径的攻略。 一、正则表达式 下面是表示文件路径的正则表达式: ^[a-zA-Z]:\\[^*?"<>|]+\.[^*?"<>|]+$ 下面是表示文件夹…

    C# 2023年5月15日
    00
  • 常用的在数据库中建立无限级树形菜单的asp.net代码

    建立无限级树形菜单是Web开发的常见需求之一。在ASP.NET框架下,我们可以使用数据库的递归查询,加上C#语言的代码逻辑来实现这个功能。下面是需要遵循的步骤和示例说明: 第一步:建立数据库表 应该建立一个名为Menus的表,包含以下字段: Id(菜单ID,主键,自增) Name(菜单名,varchar类型) ParentId(父菜单ID,int类型) 字段…

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