跳转到内容

C Sharp Lambda 语法

来自代码酷

C# Lambda语法[编辑 | 编辑源代码]

Lambda表达式是C#中一种简洁的匿名函数表示方式,它允许开发者以更紧凑的语法编写代码。Lambda表达式在C# 3.0中引入,主要用于简化委托和LINQ查询的编写。

基本概念[编辑 | 编辑源代码]

Lambda表达式的基本语法形式为:

(inputparameters)=>expression

其中:

  • input parameters:表示Lambda表达式的输入参数
  • =>:Lambda运算符,读作"goes to"
  • expression:表达式或语句块

Lambda表达式可以转换为以下两种委托类型:

  • Action:无返回值的委托
  • Func:有返回值的委托

基本语法示例[编辑 | 编辑源代码]

以下是一个简单的Lambda表达式示例:

// 使用Lambda表达式定义一个简单的加法函数
Func<int, int, int> add = (x, y) => x + y;

// 调用Lambda表达式
int result = add(5, 3);  // 输出: 8
Console.WriteLine(result);

Lambda表达式的多种形式[编辑 | 编辑源代码]

无参数Lambda[编辑 | 编辑源代码]

Action greet = () => Console.WriteLine("Hello, World!");
greet();  // 输出: Hello, World!

单参数Lambda[编辑 | 编辑源代码]

Func<int, int> square = x => x * x;
Console.WriteLine(square(5));  // 输出: 25

多参数Lambda[编辑 | 编辑源代码]

Func<int, int, bool> isEqual = (x, y) => x == y;
Console.WriteLine(isEqual(5, 5));  // 输出: True

语句Lambda[编辑 | 编辑源代码]

当需要执行多个语句时,可以使用花括号:

Action<string> greetName = name => 
{
    string greeting = $"Hello, {name}!";
    Console.WriteLine(greeting);
};
greetName("Alice");  // 输出: Hello, Alice!

Lambda表达式与委托[编辑 | 编辑源代码]

Lambda表达式通常与委托一起使用。以下示例展示了如何使用Lambda表达式作为委托参数:

// 定义一个接受委托作为参数的方法
void ProcessNumbers(int[] numbers, Func<int, bool> filter)
{
    foreach (var num in numbers)
    {
        if (filter(num))
        {
            Console.WriteLine(num);
        }
    }
}

// 使用Lambda表达式调用方法
int[] nums = { 1, 2, 3, 4, 5, 6 };
ProcessNumbers(nums, n => n % 2 == 0);  // 输出所有偶数: 2, 4, 6

Lambda表达式与LINQ[编辑 | 编辑源代码]

Lambda表达式在LINQ查询中广泛使用:

List<string> names = new List<string> { "Alice", "Bob", "Charlie", "Dave" };

// 使用Lambda表达式筛选和排序
var result = names
    .Where(name => name.Length > 3)
    .OrderBy(name => name)
    .Select(name => name.ToUpper());

foreach (var name in result)
{
    Console.WriteLine(name);  // 输出: ALICE, CHARLIE, DAVE
}

捕获外部变量[编辑 | 编辑源代码]

Lambda表达式可以捕获其外部作用域中的变量:

int factor = 2;
Func<int, int> multiplier = n => n * factor;

Console.WriteLine(multiplier(5));  // 输出: 10

// 修改捕获的变量
factor = 3;
Console.WriteLine(multiplier(5));  // 输出: 15

实际应用案例[编辑 | 编辑源代码]

事件处理[编辑 | 编辑源代码]

Lambda表达式可以简化事件处理程序的编写:

Button button = new Button();
button.Text = "Click Me";

// 使用Lambda表达式订阅事件
button.Click += (sender, e) => 
{
    MessageBox.Show("Button was clicked!");
};

异步编程[编辑 | 编辑源代码]

Lambda表达式在异步编程中也非常有用:

// 使用Lambda表达式定义异步方法
Task.Run(() =>
{
    // 模拟长时间运行的任务
    Thread.Sleep(1000);
    Console.WriteLine("Task completed!");
});

Console.WriteLine("Task started...");  // 立即输出

性能考虑[编辑 | 编辑源代码]

虽然Lambda表达式提供了编码便利性,但需要注意:

  • 每次执行Lambda表达式时都可能创建新的委托实例
  • 捕获外部变量会导致编译器生成额外的类
  • 在性能关键代码中,可能需要考虑使用命名方法

高级主题[编辑 | 编辑源代码]

表达式树[编辑 | 编辑源代码]

Lambda表达式可以转换为表达式树,这在LINQ to SQL等场景中非常有用:

Expression<Func<int, bool>> isEvenExpression = num => num % 2 == 0;

闭包[编辑 | 编辑源代码]

Lambda表达式捕获变量时创建闭包,理解这一点很重要:

List<Action> actions = new List<Action>();
for (int i = 0; i < 3; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

foreach (var action in actions)
{
    action();  // 输出: 3, 3, 3 (不是预期的0,1,2)
}

要解决这个问题,需要在循环内创建局部变量:

for (int i = 0; i < 3; i++)
{
    int temp = i;
    actions.Add(() => Console.WriteLine(temp));  // 现在输出: 0,1,2
}

总结[编辑 | 编辑源代码]

Lambda表达式是C#中强大的功能,它:

  • 提供了简洁的匿名函数语法
  • 与委托和LINQ完美集成
  • 可以捕获外部变量形成闭包
  • 在事件处理和异步编程中特别有用

掌握Lambda表达式可以显著提高代码的可读性和开发效率。