C#一分钟浅谈:Lambda 表达式和匿名方法

举报
超梦 发表于 2024/09/09 08:29:57 2024/09/09
【摘要】 在C#编程中,Lambda表达式和匿名方法都是定义没有名称的方法的方式,它们使得代码更加简洁和易于维护。本文将从基础概念入手,逐步深入探讨这两者的区别与联系,并通过具体示例帮助理解。 1. 基础概念 Lambda 表达式Lambda表达式是一种简化的方法定义方式,它允许你直接在调用位置定义一个简单的函数。其语法形式为:(parameters) => expression 或 (paramet...

在C#编程中,Lambda表达式和匿名方法都是定义没有名称的方法的方式,它们使得代码更加简洁和易于维护。本文将从基础概念入手,逐步深入探讨这两者的区别与联系,并通过具体示例帮助理解。
image.png

1. 基础概念

Lambda 表达式

Lambda表达式是一种简化的方法定义方式,它允许你直接在调用位置定义一个简单的函数。其语法形式为:

(parameters) => expression  (parameters) => { statements; }
  • parameters 是传递给 Lambda 的参数。
  • => 是 Lambda 操作符。
  • expression 或 { statements; } 是执行体。

匿名方法

匿名方法也是一种无名称的方法,但它是在方法签名之后定义的,且只能作为委托类型的值来使用。它的语法如下:

delegateType delegateInstance = delegate(parameters)
{
    // 方法体
};

2. 示例对比

假设我们需要定义一个操作,该操作接收一个整数并返回该整数的平方。

使用匿名方法实现

using System;

public class Program
{
    public static void Main()
    {
        // 定义委托类型
        Func<int, int> square = delegate(int x)
        {
            return x * x;
        };

        Console.WriteLine(square(5)); // 输出 25
    }
}

使用 Lambda 表达式实现

using System;

public class Program
{
    public static void Main()
    {
        // 使用 Lambda 表达式定义委托
        Func<int, int> square = (x) => x * x;

        Console.WriteLine(square(5)); // 输出 25
    }
}

3. 易错点及避免策略

闭包问题

Lambda 表达式可以捕获其外围作用域中的变量,这被称为闭包。如果闭包中使用的变量在其生命周期内发生了变化,则可能导致意外的结果。

错误示例

List<Func<int>> list = new List<Func<int>>();
for (int i = 0; i < 10; i++)
{
    list.Add(() => i); // 错误:所有 lambda 都引用同一个 i 变量
}

foreach (var f in list)
{
    Console.WriteLine(f()); // 输出 10, 10, 10, ...
}

解决方法 使用立即执行的匿名方法或Lambda表达式来确保每次循环创建一个新的变量副本。

List<Func<int>> list = new List<Func<int>>();
for (int i = 0; i < 10; i++)
{
    int finalI = i;
    list.Add(() => finalI); // 正确
}

foreach (var f in list)
{
    Console.WriteLine(f()); // 输出 0, 1, 2, ...
}

4. 总结

Lambda 表达式和匿名方法都提供了定义无名函数的能力,但Lambda表达式更简洁、易读。在实际开发中,应优先考虑使用Lambda表达式,除非有特定原因需要使用匿名方法。同时,注意处理好闭包带来的潜在问题,以避免程序逻辑错误。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。