335.C中使用局部函数而不用Lambda

一赫技术 2024-03-02 01:19:21
摘要

在 C# 中,局部函数和 Lambda 表达式都可以用来定义在方法内部的小型函数。然而,它们之间存在一些关键的差异。局部函数是 C# 7.0 引入的新特性,它们可以用来创建临时委托,而且在某些情况下比 Lambda 表达式更为高效和清晰。

正文应用场景

局部函数相较于 Lambda 表达式更适用于以下场景:

性能敏感的代码:局部函数通常比 Lambda 表达式更高效,因为它们不会捕获外部变量时不会创建闭包。递归调用:局部函数支持递归调用,而 Lambda 表达式则不那么直观。复杂逻辑:对于包含多个步骤或变量的复杂逻辑,局部函数可以提供更好的可读性。避免闭包的副作用:局部函数可以避免由于捕获外部变量而导致的不必要的堆分配。示例 1: 使用局部函数进行简单的操作class Program{ public static int AddNumbers(int a, int b) { // 局部函数 int AddLocal(int x, int y) => x + y; return AddLocal(a, b); // 使用局部函数 } public static void Main() { int sum = AddNumbers(3, 4); Console.WriteLine(sum); // 输出:7 }}示例 2: 使用局部函数进行递归操作class Program{ public static int Factorial(int n) { // 局部函数 int FactorialLocal(int number) { if (number <= 1) { return 1; } return number * FactorialLocal(number - 1); } return FactorialLocal(n); // 使用局部函数 } public static void Main() { int result = Factorial(5); Console.WriteLine(result); // 输出:120 }}

示例 3: 使用局部函数避免闭包public static IEnumerable<int> GetEvenNumbers(int[] numbers){ bool IsEven(int number) => number % 2 == 0; // 局部函数 foreach (var number in numbers) { if (IsEven(number)) // 使用局部函数 { yield return number; } }}public static void Main(){ int[] numbers = { 1, 2, 3, 4, 5, 6 }; foreach (var even in GetEvenNumbers(numbers)) { Console.WriteLine(even); // 输出偶数:2, 4, 6 }}

示例 4: 局部函数用于复杂逻辑public static void ProcessData(int[] data){ int GetMax() // 局部函数 { int max = int.MinValue; foreach (var number in data) { if (number > max) { max = number; } } return max; } int GetMin() // 另一个局部函数 { int min = int.MaxValue; foreach (var number in data) { if (number < min) { min = number; } } return min; } Console.WriteLine($"Max: {GetMax()}"); Console.WriteLine($"Min: {GetMin()}");}public static void Main(){ int[] data = { -1, 2, 3, -4, 5, 6 }; ProcessData(data); // 输出最大值和最小值}

结论

局部函数是 C# 中的一项强大功能,可用于创建临时委托并在方法内部定义简单或复杂的逻辑。相比于 Lambda 表达式,局部函数提供了更好的性能和递归支持,并且可以避免闭包导致的潜在副作用。在需要定义临时委托的场景中,局部函数往往是更佳的选择。通过上述示例,我们可以看到局部函数在不同场景下的应用,它们在提高代码的可读性和性能方面起到了关键作用

0 阅读:0

一赫技术

简介:感谢大家的关注