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

C#广泛应用的简洁匿名函数Lambda 表达式

Lambda 表达式是一种简洁的方式来定义匿名函数(没有名称的函数)。在 C# 中,Lambda 表达式常用于简化代码,尤其是在需要传递函数作为参数或者定义内联方法时。Lambda 表达式的语法和功能在很多 .NET API 中都得到了广泛应用,比如 LINQ 查询、事件处理和异步编程。

基本语法

Lambda 表达式的基本语法如下:

(parameters) => expression_or_statement_block

示例

  1. 无参数的 Lambda 表达式:

    Action greet = () => Console.WriteLine("Hello, World!");
    greet(); // 输出 "Hello, World!"
    
    • Action 是一个代表没有参数且没有返回值的委托类型。
    • () => Console.WriteLine("Hello, World!") 是一个无参数的 Lambda 表达式。
  2. 一个参数的 Lambda 表达式:

    Func<int, int> square = x => x * x;
    int result = square(5); // result = 25
    
    • Func<int, int> 是一个代表一个输入参数和一个输出结果的委托类型。
    • x => x * x 是一个接受一个整数参数并返回其平方的 Lambda 表达式。
  3. 多个参数的 Lambda 表达式:

    Func<int, int, int> add = (a, b) => a + b;
    int sum = add(3, 4); // sum = 7
    
    • Func<int, int, int> 是一个接受两个整数参数并返回一个整数结果的委托类型。
    • (a, b) => a + b 是一个接受两个参数并返回它们的和的 Lambda 表达式。
  4. 包含多个语句的 Lambda 表达式:

    Action<int> printDetails = x =>
    {
        Console.WriteLine($"Value: {x}");
        Console.WriteLine($"Square: {x * x}");
    };
    printDetails(5);
    
    • 这里的 Lambda 表达式包含一个语句块(用 {} 包围),可以在块内执行多个语句。

使用场景

  1. LINQ 查询: Lambda 表达式在 LINQ 查询中用作筛选、排序和选择数据的条件。

    List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
    var evenNumbers = numbers.Where(n => n % 2 == 0);
    
  2. 事件处理: Lambda 表达式可以用来快速定义事件处理程序。

    Button button = new Button();
    button.Click += (sender, e) => Console.WriteLine("Button clicked!");
    
  3. 任务和异步编程: 在任务和异步编程中,Lambda 表达式简化了代码的编写。

    Task.Run(() => 
    {
        // 异步操作
        Console.WriteLine("Task is running.");
    });
    

优势

  • 简洁: 省去了定义命名方法的开销,使得代码更加简洁。
  • 可读性: 将函数逻辑内联到调用处,提高了代码的可读性。
  • 灵活性: Lambda 表达式使得可以在运行时动态定义和传递行为。

注意事项

  • 类型推断: Lambda 表达式的参数和返回值的类型通常可以由编译器推断。
  • 作用域: Lambda 表达式可以捕获其创建时所在作用域中的变量(闭包)。

Lambda 表达式是现代编程语言中处理函数式编程的强大工具,它使得代码更加紧凑和易于理解。


http://www.kler.cn/a/311584.html

相关文章:

  • SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”
  • Secret Management|如何在 RisingWave 中安全管理敏感信息
  • 【大数据测试 Elasticsearch — 详细教程及实例】
  • 教程:FFmpeg结合GPU实现720p至4K视频转换
  • 【Pikachu靶场:XSS系列】xss之过滤,xss之htmlspecialchars,xss之herf输出,xss之js输出通关啦
  • 多模态数字人AI产品正在革新金融业,解密头部银行、证券公司都在用的AI工具
  • 基于Python的自然语言处理系列(12):使用TorchText和LSTM进行序列到序列(seq2seq)翻译
  • LVGL 控件之仪表盘(lv_meter)
  • Learn ComputeShader 15 Grass
  • 【JVM】垃圾回收
  • 派遣函数 - 缓冲区设备模拟文件读写
  • 服务器数据恢复—raid5阵列热备盘上线失败导致阵列崩溃的数据恢复案例
  • redis为什么不使用一致性hash
  • 向日葵好用吗?4款稳定的远程控制软件推荐。
  • 关于交叉编译移植到Debian开发板的一些随笔
  • gbase8s存储过程一些隐藏的错误写法
  • docker镜像源
  • info 命令:查看命令手册
  • 案例分析-Stream List 中取出值最大的前 5 个和最小的 5 个值
  • 动态内存
  • 7.Java高级编程 多线程
  • flutter Dio发送post请求
  • Linux: debug:内核log有乱码^@^@
  • Redis——分布式锁
  • JVM 虚拟机的编译器、类加载过程、类加载器有哪些?
  • Paragon NTFS for Mac和Tuxera NTFS for Mac,那么两种工具有什么区别呢?