跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 本地函数
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:C#本地函数}} '''C#本地函数'''是C# 7.0引入的一项功能,它允许在方法、构造函数、属性访问器或事件访问器内部声明另一个函数。本地函数提供了一种将逻辑封装在更小作用域内的方式,有助于提高代码的可读性和可维护性,同时避免污染外部命名空间。 == 介绍 == 本地函数是定义在另一个成员(如方法)内部的函数,它们只能在其包含的成员内部访问。与Lambda表达式不同,本地函数具有更清晰的语法,并且支持递归、泛型、迭代器(`yield return`)和异步(`async`/`await`)等功能。 本地函数的典型用途包括: * 封装仅在当前方法中使用的辅助逻辑。 * 避免重复代码。 * 实现递归算法。 * 简化复杂方法的可读性。 == 语法 == 本地函数的语法与普通方法类似,但不需要访问修饰符(如`public`或`private`),因为其作用域仅限于包含它的成员。基本语法如下: <syntaxhighlight lang="csharp"> 返回类型 函数名(参数列表) { // 函数体 } </syntaxhighlight> === 示例:基本本地函数 === 以下是一个简单的示例,演示如何在方法内部定义和使用本地函数: <syntaxhighlight lang="csharp"> public void PrintMessage() { string message = "Hello, World!"; // 定义本地函数 void DisplayMessage() { Console.WriteLine(message); // 可以访问外部变量 } DisplayMessage(); // 调用本地函数 } </syntaxhighlight> '''输出:''' <pre> Hello, World! </pre> 在此示例中,`DisplayMessage`是一个本地函数,它可以访问其包含方法`PrintMessage`中的变量`message`。 == 本地函数与Lambda表达式的区别 == 本地函数和Lambda表达式都可以在方法内部定义,但有以下关键区别: {| class="wikitable" |- ! 特性 !! 本地函数 !! Lambda表达式 |- | 语法 | 类似普通方法 | 使用`=>`运算符 |- | 作用域 | 定义后即可调用 | 必须先赋值给委托变量 |- | 递归支持 | 直接支持 | 需通过委托变量 |- | 性能 | 通常更高效(无委托分配) | 可能涉及委托分配 |- | 泛型支持 | 支持 | 不支持 |} === 示例:递归本地函数 === 本地函数天然支持递归,而Lambda表达式需要通过委托变量实现递归: <syntaxhighlight lang="csharp"> public int CalculateFactorial(int n) { if (n < 0) throw new ArgumentException("Input must be non-negative."); // 递归本地函数 int Factorial(int x) { return x <= 1 ? 1 : x * Factorial(x - 1); } return Factorial(n); } </syntaxhighlight> '''调用示例:''' <syntaxhighlight lang="csharp"> Console.WriteLine(CalculateFactorial(5)); // 输出: 120 </syntaxhighlight> == 实际应用场景 == === 场景1:封装验证逻辑 === 本地函数可用于封装仅在当前方法中使用的验证逻辑: <syntaxhighlight lang="csharp"> public void ProcessOrder(Order order) { // 本地函数验证订单 bool IsOrderValid(Order o) { return o != null && o.Items.Count > 0 && o.TotalAmount > 0; } if (!IsOrderValid(order)) throw new InvalidOperationException("Invalid order."); // 处理订单逻辑 } </syntaxhighlight> === 场景2:迭代器中的本地函数 === 本地函数可以与`yield return`结合使用,简化迭代器的实现: <syntaxhighlight lang="csharp"> public IEnumerable<int> GetFilteredNumbers(IEnumerable<int> numbers, int threshold) { // 本地函数过滤数字 IEnumerable<int> FilterNumbers() { foreach (var num in numbers) { if (num > threshold) yield return num; } } return FilterNumbers(); } </syntaxhighlight> == 高级特性 == === 泛型本地函数 === 本地函数可以定义为泛型函数: <syntaxhighlight lang="csharp"> public void ProcessData<T>(T data) { // 泛型本地函数 void DisplayData<U>(U item) { Console.WriteLine($"Data: {item}"); } DisplayData(data); } </syntaxhighlight> === 异步本地函数 === 本地函数可以标记为`async`: <syntaxhighlight lang="csharp"> public async Task<string> FetchDataAsync() { // 异步本地函数 async Task<string> DownloadContentAsync() { using (var client = new HttpClient()) { return await client.GetStringAsync("https://example.com"); } } return await DownloadContentAsync(); } </syntaxhighlight> == 性能注意事项 == * 本地函数通常比Lambda表达式更高效,因为它们不涉及委托分配(除非转换为委托)。 * 如果本地函数未转换为委托,编译器可能会将其编译为静态方法,从而避免闭包开销。 == 总结 == C#本地函数是一种强大的工具,适用于以下场景: * 需要封装仅在当前方法中使用的逻辑。 * 实现递归算法。 * 简化复杂方法的可读性。 * 与`yield return`或`async`/`await`结合使用。 通过合理使用本地函数,可以编写出更清晰、更模块化的代码。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 函数]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)