C# 局部静态函数,封闭方法中的最佳选择
C# 局部静态函数,封闭方法中的最佳选择
- 简介
- 特性
- 应用场景
- 辅助计算
- 递归与尾递归优化
- 筛选与过滤操作
- 查找与映射操作
- 生命周期
- 静态局部函数 vs 普通局部函数
- 性能
- 封装性
- 可读性
简介
C# 局部静态函数(Local Static Functions)是一种函数作用域内的嵌套函数,同时可以标记为 static,在 C# 8.0 中引入。这种特性允许我们定义更安全、更高效、更可读的辅助方法,并能在某些业务场景下带来便利和性能优化。
- 局部函数:在另一个函数内定义的嵌套函数,具有访问外部作用域变量的能力。
- 静态局部函数:添加 static 关键字,使得局部函数无法访问外部作用域变量。
using System;class Program
{static void Main(){// 局部变量int outerVariable = 42;// 普通局部函数,可以访问外部变量int NormalLocalFunction(){return outerVariable + 10;}// 静态局部函数,无法访问外部变量static int StaticLocalFunction(){return 10; // outerVariable 不可见}Console.WriteLine(NormalLocalFunction()); // 输出:52Console.WriteLine(StaticLocalFunction()); // 输出:10}
}
特性
- 封装性:局部函数属于封闭函数的内部实现细节,提高封装性。
- 静态性:静态局部函数不依赖外部变量,避免潜在的闭包问题,性能更好。
- 作用域:局部函数在封闭函数的作用域内定义和使用。
应用场景
辅助计算
可以将静态局部函数用于计算或转换操作,避免重复计算,提高代码可读性。
using System;class Program
{static void Main(){double CalculateCircleArea(double radius){static double Square(double x) => x * x;const double Pi = 3.141592653589793;return Pi * Square(radius);}double area = CalculateCircleArea(10);Console.WriteLine($"Area of circle: {area}");}
}
将局部函数声明为 static 会避免捕获外部变量,从而防止编译器生成闭包对象,提高性能。
递归与尾递归优化
静态局部函数非常适合用于递归计算。通过局部函数实现尾递归[^1] 优化。
using System;class Program
{static void Main(){int Factorial(int n){static int InnerFactorial(int n, int acc){if (n <= 1) return acc;return InnerFactorial(n - 1, acc * n);}return InnerFactorial(n, 1);}Console.WriteLine($"Factorial of 5: {Factorial(5)}"); // 输出:120}
}
[^1] 递归调用作为最后操作,累积结果直接传递,优化了栈深度
筛选与过滤操作
静态局部函数可以用于复杂的筛选和过滤操作,提高代码复用性和可读性。
using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){IEnumerable<int> FilterNumbers(IEnumerable<int> numbers){static bool IsEven(int number) => number % 2 == 0;return numbers.Where(IsEven);}var numbers = new[] { 1, 2, 3, 4, 5, 6 };var evenNumbers = FilterNumbers(numbers);Console.WriteLine("Even numbers:");foreach (var number in evenNumbers){Console.WriteLine(number);}}
}
查找与映射操作
静态局部函数可以用于查找、映射等操作,将复杂逻辑封装在局部函数内。
using System;
using System.Collections.Generic;class Program
{static void Main(){string GetGrade(int score){static string MapScoreToGrade(int score) => score switch{>= 90 => "A",>= 80 => "B",>= 70 => "C",>= 60 => "D",_ => "F"};return MapScoreToGrade(score);}var scores = new Dictionary<string, int>{{ "Alice", 92 },{ "Bob", 83 },{ "Charlie", 78 },{ "Dave", 55 }};foreach (var (name, score) in scores){Console.WriteLine($"{name}: {GetGrade(score)}");}}
}
生命周期
- 局部静态函数属于封闭函数内部。
- 封闭函数调用时,局部静态函数随之被定义,并作为封闭函数的一部分进行编译。
- 局部静态函数在封闭函数调用期间会被实例化并执行。它的生命周期与封闭函数的执行周期相关。
静态局部函数 vs 普通局部函数
性能
- 静态局部函数不捕获外部变量,不产生闭包对象,因此性能更优。
封装性
- 静态局部函数无法访问外部变量,更具封装性,减少意外副作用。
可读性
- 静态局部函数能明确表明不依赖外部状态,提高代码的可读性和逻辑清晰度。
提示:如果需要在封闭的方法内定义一个方法,并且这个方法只在封闭的方法内使用,那么使用局部静态函数通常是最佳选择。
相关文章:
C# 局部静态函数,封闭方法中的最佳选择
C# 局部静态函数,封闭方法中的最佳选择 简介特性 应用场景辅助计算递归与尾递归优化筛选与过滤操作查找与映射操作 生命周期静态局部函数 vs 普通局部函数性能封装性可读性 简介 C# 局部静态函数(Local Static Functions)是一种函数作用域内…...
【MySQL】MySQL 8.4.0 长期支持版(LTS)安装
就在2024年 “5.1” 节前,MySQL官方发布了8.4.0长期支持版(LTS - Long Term Support)。根据官方提供的文档,在本地虚拟机进行安装测试。 安装、配置和启动过程记录如下: 第一步,上传到安装包(my…...
nest中的ORM
在 Nest.js 中执行 SQL 查询通常涉及使用 TypeORM 或 Sequelize 这样的 ORM(对象-关系映射)库。这些库使得在 Nest.js 应用程序中连接和操作 SQL 数据库变得更加简单和直观。 以下是一个使用 TypeORM 在 Nest.js 中执行 SQL 查询的示例代码:…...
TCP(Transmission Control Protocol,传输控制协议)如何保证数据的完整性?
TCP(Transmission Control Protocol,传输控制协议)通过一系列机制来保证数据传输的可靠性和无错性,这些机制主要包括: 校验和:TCP报文段包含一个校验和字段,用于检测数据在传输过程中是否出错。…...
Numpy库介绍
NumPy(Numerical Python的缩写)是Python中用于科学计算的一个强大的库。它提供了高性能的多维数组对象(即ndarray)、用于处理这些数组的工具以及用于数学函数操作的函数。让我为你介绍一下它的一些主要功能: 1. 多维数…...
临时有事无法及时签字盖章?试试用契约锁设置“代理人”
遇到“领导休假中、在开重要会议、外出考察或者主任医生手术中等”一段时间内不方便或者无法及时签字盖章的情况怎么办?业务推进不了只能干等? 契约锁电子签及印控平台支持印章、签名“临时授权”、“代理签署”,实现指定人、指定时间段、指定…...
数据库权限管理
1.查看系统级权限(global level) Select * from mysql.user\G; 2.查看数据库中所有表的权限 Select * from mysql.db\G 3.远程连接数据库 第一步在有数据库服务上的主机上:授权 grant all on *.* to root192.168.40.83 identified by Zxy20234; 第…...
如何创建一个 Django 应用并连接到数据库
简介 Django 是一个用 Python 编写的免费开源的 Web 框架。这个工具支持可扩展性、可重用性和快速开发。 在本教程中,您将学习如何为一个博客网站建立与 MySQL 数据库的初始基础。这将涉及使用 django-admin 创建博客 Web 应用程序的骨架结构,创建 MyS…...
【算法刷题day44】Leetcode:518. 零钱兑换 II、377. 组合总和 Ⅳ
文章目录 Leetcode 518. 零钱兑换 II解题思路代码总结 Leetcode 377. 组合总和 Ⅳ解题思路代码总结 草稿图网站 java的Deque Leetcode 518. 零钱兑换 II 题目:518. 零钱兑换 II 解析:代码随想录解析 解题思路 先遍历物品,再遍历背包。 代码…...
『51单片机』AT24C02[IIC总线]
存储器的介绍 ⒈ROM的功能⇢ROM的数据在程序运行的时候是不容改变的,除非你再次烧写程序,他就会改变,就像我们的书本,印上去就改不了了,除非再次印刷,这个就是ROM的原理。 注→在后面发展的ROM是可以可写可…...
Jenkins与Rancher的配合使用
Jenkins和Rancher是两个常用的DevOps工具,可以很好地配合使用来实现持续集成和持续部署。 Jenkins是一个开源的自动化构建工具,可以实现自动化的代码构建、测试和部署等一系列操作。可以通过Jenkins来触发构建任务,例如从代码仓库中拉取最新的…...
GIS入门,常用的多边形平滑曲线算法介绍和JavaScript的多边形平滑曲线算法库chaikin-smooth的实现原理和使用
前言 本章介绍一下常用的多边形平滑曲线算法及其使用案例。 多边形平滑算法通常用于图形处理或计算机图形学中,以使线条或曲线在连接处平滑过渡,而不出现明显的棱角或断裂。多边形平滑算法有多种实现方法,其中一些常见的有下面几种: 贝塞尔曲线插值(Bezier Curve Interpo…...
气膜体育馆内部的采光效果如何?—轻空间
气膜体育馆内部的采光效果如何?这是许多人对这种创新建筑的一个关键关注点。 首先,气膜体育馆的采光性非常好。阳光透过屋顶时以漫射光的方式进入室内,这种透射方式使得室内的光线柔和而均匀。从内部观察,整个屋顶就像一个连续的明…...
矩阵的对称正定性判决(复习)
文章目录 本科学的数学知识忘的太快了 如何判断一个实矩阵是否是对称正定 在线性代数中,一个实对称矩阵是否为正定可以通过以下方法判断: 对称性: 首先,确认矩阵是否对称,即矩阵的转置是否等于其本身。 特征值检查&…...
网络安全之DHCP详解
DHCP:Dynamic Host Configration Protocol 动态主机配置协议 某一协议的数据是基于UDP封装的,当它想确保自己的可靠性时,这个协议要么选确认重传机制,要么选周期性传输。 DHCP是确认重传,【UDP|DHCP】,当DHCP分配完地…...
【Proteus】LED呼吸灯 直流电机调速
1.LED呼吸灯 #include <REGX51.H> sbit LEDP2^0; void delay(unsigned int t) {while(t--); } void main() {unsigned char time,i;while(1){for(time0;time<100;time){for(i0;i<20;i){LED0;delay(time);LED1;delay(100-time);}}for(time100;time>0;time--){fo…...
今天遇到一个GPT解决不了的问题
问题描述 你好,postman的一个post请求,编辑器里面放了一个很长的json数据,报Tokenization is skipped for long lines for performance reasons. This can be configured via editor.maxTokenizationLineLength.,但是同样的数据&a…...
优化SQL的方法
来自组内分享,包含了比较常使用到的八点: 避免使用select * union all代替union 小表驱动大表 批量操作 善用limit 高效的分页 用连接查询代替子查询 控制索引数量 一、避免使用select * 消耗数据库资源 消耗更多的数据库服务器内存、CPU等资源。 消…...
库存管理系统开源啦
软件介绍 ModernWMS是一个针对小型物流仓储供应链流程的开源库存管理系统。该系统的开发初衷是为了满足中小型企业在有限IT预算下对仓储管理的需求。通过总结多年ERP系统研发经验,项目团队开发了这套适用于中小型企业的系统,以帮助那些有特定需求的用户。…...
【java】接口
什么是接口 接口当中存在的是对方法的定义,而不是对方法的具体实现。 为什么不实现这个方法呢? 继承的本质是代码的复用。当一个父类会经常被继承,并且子类都要自己实现方法时,父类中的方法就会显得累赘,并且占用了…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
