VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#编程 >
  • Lambda表达式:简化委托与匿名方法

Lambda表达式:简化委托与匿名方法

  1. Lambda表达式的核心价值
    Lambda表达式是C#中简洁的匿名函数,用于快速创vb.net教程C#教程python教程SQL教程access 2010教程建委托实例或表达式树。它的核心作用是:

替代匿名方法:去掉冗余的delegate关键字,代码更简洁;

降低代码冗余:无需单独定义方法,直接在使用处编写逻辑;

提升可读性:将逻辑与调用点紧密结合,减少跳转。

Lambda的本质是编译器自动生成的匿名方法,但语法更紧凑,是现代C#开发中不可或缺的工具。

  1. Lambda语法基础
    Lambda表达式的基本语法为:

    csharp

    (参数列表) => 表达式或语句块

关键规则:

无参数:用空括号()表示;

单参数:可省略括号(如x => x*2);

多参数:用括号括起(如(a,b) => a+b);

方法体:单表达式无需大括号(自动返回结果),多语句需用大括号+return。

示例:

场景
Lambda表达式

无参数,无返回值
() => Console.WriteLine("Hello")

单参数,无返回值
name => Console.WriteLine(name)

多参数,有返回值
(a,b) => a*b

多语句,有返回值
x => { var res = x*x; return res; }

  1. 从匿名方法到Lambda:简化对比
    匿名方法是Lambda的前身,但语法更繁琐。以下通过对比展示Lambda的简化效果。

3.1 匿名方法的写法

  csharp
using System;

 

class Program

{

    static void Main()

    {

        // 用匿名方法创建Action委托

        Action<string> greet = delegate(string name) 

        { 

            Console.WriteLine($"Hello {name}"); 

        };

        

        greet("Lambda"); // 输出:Hello Lambda

    }

}

3.2 Lambda表达式的简化

  csharp
using System;

 

class Program

{

    static void Main()

    {

        // 用Lambda替代匿名方法:去掉delegate关键字+参数类型

        Action<string> greet = name => Console.WriteLine($"Hello {name}");

        

        greet("Lambda"); // 输出:Hello Lambda

    }

}

3.3 逐行讲解对比

匿名方法:需用delegate关键字声明,参数类型必须显式指定;

Lambda:省略delegate,编译器自动推断参数类型(name为string,因Action的参数类型是string);

核心简化:减少了50%以上的代码量,逻辑更直观。

  1. Lambda与内置委托的结合
    实际开发中,很少手动声明委托,而是用.NET内置的Func(有返回值)和Action(无返回值)委托。Lambda与它们结合使用,效率更高。

4.1 与Func结合(有返回值)

  csharp
using System;

 

class Program

{

    static void Main()

    {

        // Func<int, int>:输入int,返回int

        Func<int, int> square = x => x*x; 

        int result = square(5); // 结果:25

        Console.WriteLine($"5的平方:{result}");

        

        // Func<string, bool>:输入string,返回bool

        Func<string, bool> isLong = s => s.Length >5;

        bool res = isLong("HelloWorld"); // 结果:true

        Console.WriteLine($"字符串是否过长:{res}");

    }

}

4.2 与Action结合(无返回值)

  csharp
using System;

 

class Program

{

    static void Main()

    {

        // Action:无参数,无返回值

        Action showMsg = () => Console.WriteLine("这是无参数的Lambda");

        showMsg();

        

        // Action<int, string>:输入int和string,无返回值

        Action<int, string> printUser = (age, name) => 

        {

            Console.WriteLine($"姓名:{name},年龄:{age}");

        };

        printUser(25, "张三"); // 输出:姓名:张三,年龄:25

    }

}
  1. 基础知识拓展
    5.1 闭包:Lambda捕获外部变量
    Lambda可以捕获外部作用域的变量,形成闭包。需注意:Lambda捕获的是变量的引用,而非值。

示例:

  csharp
      
using System;

using System.Collections.Generic;

 

class Program

{

    static void Main()

    {

        var actions = new List<Action>();

        for(int i=0; i<3; i++)

        {

            // 捕获外部变量i

            actions.Add(() => Console.WriteLine($"i的值:{i}"));

        }

        

        foreach(var a in actions) a(); // 输出:3,3,3(而非0,1,2)

    }

}

原因:循环结束后i的值为3,Lambda捕获的是i的引用,所以所有委托执行时i都是3。

解决方法:用临时变量保存当前值:

  csharp
      
for(int i=0; i<3; i++)

{

    int temp = i; // 临时变量保存当前i的值

    actions.Add(() => Console.WriteLine($"i的值:{temp}"));

}

// 输出:0,1,2

5.2 Lambda与表达式树
Lambda可以转换为表达式树(Expression),用于动态解析逻辑(如ORM框架生成SQL)。

示例:

  csharp
using System;

using System.Linq.Expressions;

 

class Program

{

    static void Main()

    {

        // 转换为表达式树(而非委托)

        Expression<Func<int, bool>> isEven = x => x%2 ==0;

        

        // 解析表达式树(获取逻辑结构)

        BinaryExpression body = (BinaryExpression)isEven.Body;

        Console.WriteLine($"表达式类型:{body.NodeType}"); // 输出:Equal

        Console.WriteLine($"左操作数:{body.Left}"); // 输出:x % 2

        Console.WriteLine($"右操作数:{body.Right}"); // 输出:0

    }

}

区别:

委托Lambda:编译为IL代码,直接执行;

表达式树Lambda:编译为表达式树结构,可动态解析(适合ORM、动态查询场景)。

5.3 Lambda的类型推断
编译器会根据上下文自动推断Lambda的参数类型和返回类型:

若Lambda赋值给Func<int, int>,则参数类型为int,返回类型为int;

单参数时可省略括号(如x => x*2),多参数需括号;

单表达式无需return,多语句需显式return。

  1. 总结与练习
    6.1 总结
    Lambda表达式是C#中简化委托和匿名方法的利器,核心要点:

语法简洁:(参数) => 表达式/语句块;

与内置委托(Func/Action)结合使用,减少冗余;

闭包捕获外部变量(注意引用问题);

支持转换为表达式树,用于动态解析。

6.2 练习
实现以下功能,用Lambda表达式简化代码:

用List的Find方法,查找第一个大于10的元素;

用List的Sort方法,按字符串长度排序;

用Func<double, double>计算圆的面积(πr²)。

参考代码:

  csharp
using System;

using System.Collections.Generic;

 

class Program

{

    static void Main()

    {

        // 1. 查找第一个大于10的元素

        List<int> nums = new List<int>{5,8,12,3,15};

        int firstGreater = nums.Find(x => x>10);

        Console.WriteLine($"第一个大于10的元素:{firstGreater}");

        

        // 2. 按字符串长度排序

        List<string> words = new List<string>{"apple","banana","cherry","date"};

        words.Sort((a,b) => a.Length.CompareTo(b.Length));

        Console.WriteLine("按长度排序后的字符串:");

        foreach(var word in words) Console.WriteLine(word);

        

        //3. 计算圆面积

        Func<double, double> circleArea = r => Math.PI * r * r;

        double area = circleArea(5);

        Console.WriteLine($"半径5的圆面积:{area:F2}");

    }

}

    

(本节完)

下一章:LINQ查询基础:用Lambda简化数据操作

(深入讲解Lambda在LINQ中的应用,如Where、Select、OrderBy等)

本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49376.html


相关教程