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 普通局部函数

性能

  • 静态局部函数不捕获外部变量,不产生闭包对象,因此性能更优。

封装性

  • 静态局部函数无法访问外部变量,更具封装性,减少意外副作用。

可读性

  • 静态局部函数能明确表明不依赖外部状态,提高代码的可读性和逻辑清晰度。

提示:如果需要在封闭的方法内定义一个方法,并且这个方法只在封闭的方法内使用,那么使用局部静态函数通常是最佳选择。

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

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

相关文章

51单片机keil编程中遇到的问题(持续更新)

字符无法打印报错 查看特殊功能寄存器名字的时候也会报错&#xff0c;因为无法编译通过&#xff0c;导致头文件的定义内容无法查找 keil编译中 error C127: ‘xx’: invalid storage class 这种一般是在编写头文件或源文件时&#xff0c;在声明函数的结尾没有添加分号&…

在阿里云K8S容器中,部署websocket应用程序的总结

一、背景 有一个websocket应用程序&#xff0c;使用spring boot框架开发&#xff0c;http端口号是6005&#xff0c;提供的是websocket服务&#xff0c;所以它还监听一个8889端口的tcp协议。 现在要把它部署到阿里云的k8s容器里&#xff0c;本文着重描述service层的配置。 因…

深度解析GoLand map原理及实现,手撕源码!(一)——基本介绍,初始化,读

深度解析GoLand map原理及实现&#xff0c;手撕源码&#xff01;&#xff08;一&#xff09;——基本介绍&#xff0c;初始化&#xff0c;读 一、map(1) map的初始化&#xff1a;(2) map的基本方法&#xff1a;(3) map的核心原理(4) map源码详解4.1 结构体4.1.1 hmap4.1.2 mape…

《intel开发手册卷1》学习笔记1

1、操作模式 IA-32架构支持三种基本操作模式:保护模式、实地址模式和系统管理模式。操作模式决定了哪些指令和体系结构功能是可访问的: 1&#xff09;保护模式&#xff1a;该模式是处理器的自然状态。保护模式的功能之一是能够在受保护的多任务环境中直接执行“实地址模式”80…

Mac 电脑安装 Raptor 流程图软件的方法

0. 安装逻辑 &#xff08;1&#xff09;运行 raptor&#xff0c;本质上需要 mac 能够运行 windows 程序&#xff0c;因此需要安装 .NET Runtime 7.0&#xff0c;这是微软程序运行必须的文件。 &#xff08;2&#xff09;运行 raptor 还需要安装依赖文件 mono-libgdiplus。 &am…

RabbitMQ - 以 MQ 为例,手写一个 RPC 框架 demo

目录 前言 一、再谈自定义应用层协议 二、再谈 BrokerServer 三、再谈 Connection、Channel 四、Demo a&#xff09;启动服务器 b&#xff09;客户端连接 前言 本篇文章来自于笔者之前写过的一个系列 —— “根据源码&#xff0c;模拟实现 RabbitMQ” 系列&#xff0c…

Linux-笔记 常用命令

&#xff08;持续更新&#xff09; 1、压缩&#xff1a; tar -vcjf test1.tar.bz2 test1 tar -vczf test1.tar.gz test1 2、解压 tar -vxjf test1.tar.bz2 tar -vxzf test2.tar.gz 3、查找 find [路径] [参数] [文件名] : find / -name test* grep [参数] 关键字 路径&a…

JS中数组去重的几种方法

在JavaScript中&#xff0c;有多种方法可以实现数组去重。以下是一些常见的方法&#xff1a; 1&#xff0c;使用ES6的Set数据结构 Set数据结构只允许存储唯一的值&#xff08;无论是原始值或者是对象引用&#xff09;&#xff0c;因此是数组去重的理想选择。 let arr [1, 2…

CentOs9编译C指令报错的一种解决方案

今天使用centos9编译c代码时&#xff0c;显示bash: gcc: command not found... 下图是我的报错页面&#xff0c;依据提示信息安装gcc之后依旧显示失败 找到其中一种解决方式&#xff0c;完美解决&#xff0c;供参考 输入以下指令更新软件包列表&#xff0c;这里需要等待几分…

MT3031 AK IOI

思路&#xff1a;把每个节点存到堆&#xff08;大根堆&#xff09;里。 如果节点放入后总时间没有超过m则放入堆中&#xff1b;如果总时间超过了&#xff0c;就看堆头元素是否比新元素大。如果大&#xff0c;则删除堆头&#xff08;反悔贪心&#xff09;。 注意别忘记开long l…

keystone学习小结

1 keystone middleware 1.1 工作流程 middleware在客户端和服务端之间&#xff0c;会拦截客户端请求并判断请求身份是否是正确合法的&#xff0c;若是&#xff0c;则继续将请求发给其他middleware或app 具体看&#xff0c;干了这些事 1将请求里的auth header去除&#xff0c…

毕业论文画图软件推荐

给大家分享了一些毕业论文画图软件&#xff0c;仅供参考&#xff01; 1.Microsoft visio 推荐指数:⭐️⭐️⭐️⭐️ ✅优点: -功能真的多且强大 -反正功能真的挺全的比较细节&#xff0c;但好像没有模板&#xff1f; ❌缺点: -不好安装&#xff0c;需要激活使用 -文件大&…

爬虫:爬取豆瓣电影

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 上篇我们将到如何利用xpath的规则&#xff0c;那么这一次&#xff0c;我们将通过案例来告诉读者如何使用Xpath来定位到我们需要的数据&#xff0c;就算你不懂H5代码是怎么个嵌套或者十分复…

C++新特性-线程

主要内容 thread、condition、mutexatomicfunction、bind使用新特性实现线程池&#xff08;支持可变参数列表&#xff09;异常协程其他 1 C11多线程thread 重点&#xff1a; join和detach的使用场景thread构造函数参数绑定c函数绑定类函数线程封装基础类互斥锁mutexconditi…

计算机组成原理网课笔记

无符号整数的表示与运算 带符号整数的表示与运算 原反补码的特性对比 移码

搜狗输入法 PC端 v14.4.0.9307 去广告绿化版.

软件介绍 搜狗拼音输入法作为众多用户计算机配置的必备工具&#xff0c;其功能的全面性已为众所周知&#xff0c;并且以其高效便捷的输入体验受到广大使用者的青睐。然而&#xff0c;该软件在提供便利的同时&#xff0c;其内置的广告元素常常为用户带来一定的干扰。为此&#…

Linux中动态库的用法及优缺点?怎样制作动态库和静态库?

一、什么是gcc gcc的全称是GNU Compiler Collection&#xff0c;它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器&#xff08;GNU C Compiler&#xff09;&#xff0c;现在除了c语言&#xff0c;还支持C、java、Pascal等语言。gcc支持多种硬件平台. 在 Linux…

PostgreSQL-常用函数和操作符

PostgreSQL 中文社区 PL/pgSQL 是 PostgreSQL 中的一种存储过程语言&#xff0c;它支持许多常用的函数和操作符。下面列举了一些常用的 PL/pgSQL 函数和操作符&#xff1a; 1. 常用函数&#xff1a; RAISE&#xff1a;用于在存储过程中抛出异常。 RAISE EXCEPTION Error oc…

航空电子ARINC818采集卡

ARINC818采集卡是针对航空电子数字视频总线协议&#xff08;Avionics Digital Video BUS&#xff0c;ADVB&#xff09;的高性能PCIe视频光纤采集测试设备。ARINC818协议主要应用于机载设备间的实时高清图像传输&#xff0c;目前已经成功应用于多款民用、军用机型当中&#xff0…

渐进淡出背景个人导航页源码(火影版)

渐进淡出背景个人导航页源码&#xff08;火影版&#xff09; 效果图部分源码领取源码下期更新预报 效果图 部分源码 <!DOCTYPE html> <html> <head> <!--小K网 www.xkwo.com --><meta charset"UTF-8"><title>火影版个人主页<…