当前位置: 首页 > news >正文

c# 局部函数 定义、功能与示例

C# 局部函数:定义、功能与示例

1. 定义与功能
局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。
• 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升代码可读性和安全性。

• 特点:

• 支持async、迭代器(yield return)、泛型。

• 可直接访问包含方法的局部变量和参数(类似闭包)。

• 编译后可能被优化为静态方法(不依赖外部变量时)或实例方法(依赖时)。

2. 示例与实际场景

public class Calculator
{public double CalculateCircleArea(double radius){// 局部函数:计算平方double Square(double x) => x * x;return Math.PI * Square(radius);}// 实际应用:递归算法public int Factorial(int n){if (n < 0) throw new ArgumentException("负数无阶乘");return RecursiveFactorial(n);// 局部函数实现递归int RecursiveFactorial(int k) => k <= 1 ? 1 : k * RecursiveFactorial(k - 1);}
}

场景:
• 数学计算:封装辅助计算逻辑(如Square)。

• 递归算法:避免暴露递归辅助方法(如RecursiveFactorial)。

• 参数验证:在方法开头集中校验后调用局部函数执行核心逻辑。


局部函数 vs Lambda表达式

1. 语法对比

特性局部函数Lambda表达式
定义方式类似普通方法,用返回值 函数名()委托变量赋值:Func<int, int> f = x => x * x;
返回值显式声明自动推断
参数默认值支持(void F(int x = 0)不支持
泛型支持支持需通过委托类型间接支持

2. 关键差异

差异点局部函数Lambda表达式
编译结果编译为独立方法(可能静态或实例)编译为委托实例或表达式树
内存开销无额外分配(静态时)每次分配委托实例(除非静态缓存)
递归调用直接支持(效率高)需通过变量捕获(Func<int, int> f = null; f = x => x * f(x-1);
变量捕获隐式捕获包含方法的变量显式捕获外部变量(闭包)
迭代器/异步原生支持yield/async需返回特定委托类型(如Func<IEnumerable<int>>

3. 示例对比

// 局部函数:清晰递归
public int Fibonacci(int n)
{if (n < 0) throw new ArgumentException();return Fib(n);int Fib(int k) => k <= 1 ? k : Fib(k - 1) + Fib(k - 2);
}// Lambda表达式:递归需绕行
public int FibonacciLambda(int n)
{Func<int, int> fib = null;fib = k => k <= 1 ? k : fib(k - 1) + fib(k - 2);return fib(n);
}

4. 何时选择?
• 用局部函数:

• 需要递归、迭代器或async

• 逻辑复杂且需重用(如多次调用)。

• 希望减少内存分配(如高频调用的辅助方法)。

• 用Lambda:

• 短小逻辑且一次性使用(如LINQ查询中的条件)。

• 需要动态组合行为(如委托变量在运行时赋值)。

5. 性能注意
• Lambda:每次调用可能触发委托分配(除非缓存),对性能敏感场景需谨慎。

• 局部函数:无额外开销(尤其静态情况),适合优化关键路径代码。


总结
局部函数和Lambda在C#中互补:前者适合封装复杂或可复用的内部逻辑,后者适合简短的一次性操作。根据场景需求(递归、性能、语法清晰度)选择最合适的工具。

http://www.dtcms.com/a/240625.html

相关文章:

  • C#学习第29天:表达式树(Expression Trees)
  • 深度学习:小米 MiMo-VL 技术报告学习
  • Delivering Arbitrary-Modal Semantic Segmentation(CVPR2023)任意模态语义分割论文阅读
  • 鸟巢邂逅 3D 全景漫游,一场科技与建筑的梦幻交织​
  • 基于ThinkPHP8.*的后台管理框架--Veitool框架学习使用
  • 网络安全等级保护中关于SSL证书的整改如何处理?
  • Python爬虫(三):BeautifulSoup库
  • Spring类型转换融入IOC生命周期
  • 一款 AI 驱动的 Wiki 知识库
  • macOS 终端智能代理检测
  • Oracle查询表空间大小
  • Python Ovito统计金刚石结构数量
  • EtherCAT主站转Profinet网关接IS620N伺服驱动器与西门子plc通讯案例
  • 01__C++入门
  • 高等三角函数大全
  • 《信号与系统》第 6 章 信号与系统的时域和频域特性
  • Maven从入门到精通指南
  • MyBatis-Plus 常用条件构造方法
  • uniapp实现的具备丝滑动画的标签工具栏模板
  • Django 5 学习笔记总纲
  • [蓝桥杯 2024 国 Java B] 美丽区间
  • Unity中的Mathf.Lerp
  • 记录一次opengl显示不出物体的错误原因
  • SQL进阶之旅 Day 22:批处理与游标优化
  • 什么是闭包,JavaScript闭包详解
  • 47 通道注意力 热力图
  • 基于Java项目的Karate API测试
  • SpringBoot配置
  • 245. 2019年蓝桥杯国赛 - 数正方形(困难)- 递推
  • Redis实战-黑马点评项目完结(p78-p95)