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

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.xdnf.cn/news/12951.html

相关文章:

  • 「Java基本语法」变量的使用
  • redis--黑马点评--Redisson快速入门
  • 自动化过程中,如何定位一闪而过的toast?
  • 【11408学习记录】考研数学攻坚:行列式本质、性质与计算全突破
  • Xen Server服务器释放磁盘空间
  • 什么是CRM客户管理系统?怎样的企业需要用CRM客户管理系统?
  • SQL 注入:JDO与Hibernate
  • @Lazy原理与实战
  • 商品中心—1.B端建品和C端缓存的技术文档二
  • 【动态规划】B4336 [中山市赛 2023] 永别|普及+
  • 【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
  • 总结___
  • CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx
  • python基础day06
  • 【大模型:知识库管理】--开源工具Ragflow构建知识库
  • 多核处理器系统中内存一致性问题举例
  • 记录一次opengl显示不出物体的错误原因
  • Vite中定义@软链接
  • 【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
  • 期货与期权市场基本原理是什么?
  • CSS设置元素的宽度根据其内容自动调整
  • 基于django+vue的健身房管理系统-vue
  • 等待组(waitgroup)
  • 【JVM】- 内存结构
  • 【python异步多线程】异步多线程爬虫代码示例
  • 电子电路中隔离的隔离技术​
  • 力扣-35.搜索插入位置
  • 数据挖掘是什么?数据挖掘技术有哪些?
  • 技术栈RabbitMq的介绍和使用
  • React事件处理:如何给按钮绑定onClick点击事件?