C# 本地方法和lambda实现

概念: 本地函数是一种嵌套在另一成员中的类型的方法。 仅能从其包含成员中调用它们。

下面是本地方法最简单的一个demo:

public static int Show(){int c = NewMethod(); return c;static int NewMethod(){#region 测试int a = 3;int b = 9;int c = a + b;#endregionreturn c;}}

本地函数语法

 本地函数可使代码意图明确。 任何读取代码的人都可以看到,此方法不可调用,包含方法除外。 对于团队项目,它们也使得其他开发人员无法直接从类或结构中的其他位置错误调用此方法。

本地方法使用注意事项:

1. 本地函数不能使用修饰符,因为都是私有的,包括访问修饰符(如 private 关键字)会生成编译器错误 CS0106“修饰符‘private’对于此项无效”。

2. 本地函数,本地方法一般放在方法的结尾

private static string GetText(string path, string filename)
{var reader = File.OpenText($"{AppendPathSeparator(path)}{filename}");var text = reader.ReadToEnd();return text;string AppendPathSeparator(string filepath){return filepath.EndsWith(@"\") ? filepath : filepath + @"\";}
}


     本地函数与 Lambda 表达式

本地函数和 Lambda 非常相似。 但是,应该注意,从两者中选用一种的时机和条件其实是存在差别的。

让我们检查一下阶乘算法的本地函数实现和 lambda 表达式实现之间的差异。 下面是使用本地函数的版本:

public static int LocalFunctionFactorial(int n)
{
    return nthFactorial(n);

    int nthFactorial(int number) => number < 2 
        ? 1 
        : number * nthFactorial(number - 1);
}

public static int LambdaFactorial(int n)
{
    Func<int, int> nthFactorial = default(Func<int, int>);

    nthFactorial = number => number < 2
        ? 1
        : number * nthFactorial(number - 1);

    return nthFactorial(n);
}

明确赋值

Lambda 表达式是在运行时声明和分配的对象。 若要使用 Lambda 表达式,需要对其进行明确赋值:必须声明要分配给它的 Action/Func 变量,并为其分配 Lambda 表达式。 请注意,LambdaFactorial 必须先声明和初始化 Lambda 表达式 nthFactorial,然后再对其进行定义。 否则,会导致分配前引用 nthFactorial 时出现编译时错误。

本地函数在编译时定义。 由于未将它们分配给变量,因此可以从范围内的任意代码位置引用它们;在第一个示例 LocalFunctionFactorial 中,我们可以在 return 语句的上方或下方声明本地函数,而不会触发任何编译器错误。

这些区别意味着使用本地函数创建递归算法会更轻松。 你可以声明和定义一个调用自身的本地函数。 必须声明 Lambda 表达式,赋给默认值,然后才能将其重新赋给引用相同 Lambda 表达式的主体。

int M()
{
    int y;
    LocalFunction();
    return y;

    void LocalFunction() => y = 0;
}

这段代码定义了一个名为LocalFunction()的方法,该方法使用lambda表达式定义了一个局部函数,并将其实现设为将变量y的值设为0。

等于如下:

void LocalFunction()
{
    y = 0;
}
 实现详细信息包括本地函数的闭包是作为 class 还是 struct 实现。 本地函数可能使用 struct,而 lambda 将始终使用 class

虽然本地函数对 lambda 表达式可能有点冗余,但实际上它们的目的和用法都不一样。 如果想要编写仅从上下文或其他方法中调用的函数,则使用本地函数更高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python opencv实现车牌识别

目录 一:实现步骤: 二:实现车牌检测 一:实现步骤: 使用Python和OpenCV实现车牌识别的步骤大致可以分为以下两部分: 车牌检测: 读取需要进行车牌识别的图片。 对图像进行灰度化处理,可能还包括高斯模糊和灰度拉伸。 进行开运算,消除图像中的噪声。 将灰度拉伸后的图…

培养纳税筹划思维方式,企业税务筹划实务操作

一、教程描述 本套税务筹划教程&#xff0c;大小447.87M&#xff0c;共有6个文件。 二、教程目录 前言.mp4 培养纳税筹划思维方式.mp4 增值税的税务筹划.mp4 企业所得税的税务筹划.mp4 个人所得税的税务筹划.mp4 企业税务筹划实务操作&#xff08;课件&#xff09;.pdf…

MDST150-16-ASEMI三相可控整流模块MDST150-16

编辑&#xff1a;ll MDST150-16-ASEMI三相可控整流模块MDST150-16 型号&#xff1a;MDST150-16 品牌&#xff1a;ASEMI 正向电流&#xff08;Id&#xff09;&#xff1a;150A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1600V 正向浪涌电流&#xff1a;1200A 正…

大数据揭秘:Hadoop短视频流量分析实战

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

PyTorch概述(一)---图像变换和增强

TorchVision torchvision 包由流行的数据集、模型架构以及用于计算机视觉的通用图片转换工具组成 TorchVision 包构成 图像变换和增强TVTensors模型和预训练的权重数据集工具操作图像和视频的编/解码用于模型检测的特征提取 图像变换和增强 torchvision支持通用的计算机视…

基于springboot+vue的车辆管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

获取淘宝商品详情API、商品主图、图片搜索api

获取淘宝详情API的方式有以下几种&#xff1a; 使用淘宝开放平台提供的接口&#xff1a;淘宝开放平台提供了多个API接口&#xff0c;让开发者可以通过接口获取商品详情信息。你可以到淘宝开放平台官网申请开发者账号&#xff0c;并查看相关接口文档&#xff0c;了解如何使用接…

C语言翻译环境:预编译+编译+汇编+链接详解

目录 翻译环境和运行环境 翻译环境 预处理&#xff08;预编译&#xff09; 编译 词法分析 语法分析 语义分析 汇编 链接 运行环境 ⭐翻译环境和运行环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被…

H桥逆变方式介绍(单极性)

H桥逆变电路实现的就是一个从DC——AC的过程 这个电路有两个时序&#xff0c;Q6Q4是一个导通时序&#xff0c;Q5Q7是一个导通时序 左边两个是高频20KHZ的、互补的sPWM波&#xff0c;右边是低频的50HZ的PWM波 三角波一般叫载波&#xff0c;正弦波叫调制波&#xff08;单片机内…

Hbase和Clickhouse对比简单总结

Hbase和Clickhouse是两种不同的数据库系统&#xff0c;它们各自适用于不同的场景。以下是两者之间的对比&#xff1a; 数据模型&#xff1a; HBase 是一种基于列的存储系统&#xff0c;它适合处理大规模的数据集&#xff0c;特别是那些需要快速随机访问的场景。ClickHouse 则是…

对“绝地求生“源码调节

调整了一些界面和降低游戏难度 #include "c.h" using namespace std; ExMessage msg; struct ME {int x 100; int y 100; int life 1000; int knapsack[18]; int Maximum_ammunition_capacity 0;int Ammunition_capacity 0; int primary_weapon 0; int moveme…

springboot/ssm仓库管理系统Java货物出入库管理系统wms系统web

springboot/ssm仓库管理系统Java货物出入库管理系统wms系统web 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a…

Vi/Vim 使用小窍门,如何消除搜索后的关键字高亮

Vim/Vi 基本上是 *nix 世界最受欢迎的编辑器了&#xff0c;不知道为什么&#xff0c;一直以来觉得和 Emacs 比起来&#xff0c;Vim 更加有亲和力。用起来很舒服。 今天就记录一个困扰了我很久的问题。 大家应该都知道&#xff0c;在 Vi 里面如果要搜索某个关键字&#xff0c;…

C语言开发教程

C语言开发教程 电子书下载 下载地址 第一章 导言 1.1 入门 1.2 变量与算术表达式 1.3 for语句 1.4 符号常量 1.5 字符输入/输出 1.6 数组 1.7 函数 1.8 参数--传值调用 1.9 字符数组 1.10 外部变量与作用域 第二章 类型、运算符与表达式 2.1 变量名 2.2 数据类型及长度 2.3 常…

汽车会撞死人,应不应该限制汽车?

激进派表示事故率很低&#xff0c;损失相比汽车带来的收益不值一提&#xff0c;不能限制汽车 保守派表示行人什么也没有做错&#xff0c;却飞来横祸&#xff0c;只要发生一起事故&#xff0c;可能对一个家庭就是灭顶之灾&#xff0c;应该严格限制汽车 两边都有道理&#xff0c…

Python-pdfplumber读取PDF内容

文章目录 前言一、pdfplumber模块1.1 pdfplumber的特点1.2 pdfplumber.PDF类1.3pdfplumber.Page类 二 pdfplumber的使用2.1 加载PDF2.2 pdfplumber.PDF 类2.3 pdfplumber.Page 类2.4 读取PDF2.5 读取PDF文档信息2.6 查看总页数2.7 查看总页数读取第一页的宽度&#xff0c;页高等…

263集成客服系统:提升电商平台用户体验

{连接&#xff1a;无缝整合客服渠道} 在电子商务领域&#xff0c;客服是保持客户满意度和忠诚度的关键因素。263集成客服系统允许电商平台无缝连接到各种客服通道&#xff0c;包括在线聊天、电子邮件和社交媒体等。这种无代码开发方式不仅消除了传统API开发的复杂性&#xff…

使用Java调用Cplex求解带时间窗的车辆路径问题

使用Java调用Cplex求解VRPTW问题 一、带时间窗车辆路径优化问题&#xff08;Vehicle Routing Problem with Time Window&#xff0c;VRPTW&#xff09;1.1 问题描述1.2 模型构建 二、使用Java调用Cplex求解VRPTW问题2.1 完整代码2.2 求解结果 三、求解过程中踩的坑 一、带时间窗…

DevOps:实现软件开发与运维的协同革命

DevOps作为一种新型的软件开发和运维模式&#xff0c;在当今信息技术领域引起了广泛关注和应用。本文通过对DevOps的定义、原则、核心实践以及优势等方面进行探讨&#xff0c;旨在深入剖析DevOps对软件开发与运维的革命性影响&#xff0c;并从实践角度探讨其在现代软件开发中的…

VsCode编译wxWidgets的HelloWorld

wxWidgets 环境搭建 在wxWidgets 官网下载页面点击Download Windows Binaries选择TDM-GCC 10.3和MinGW-w64 8.1下的头文件和开发包进行下载。这儿我们会用两种 gcc 编译器进行对比&#xff0c;所以下载 2 个种编译器对应的库文件。正常只需根据自己安装的编译器下载对应的 1 种…