-
Lambda表达式:简化委托与匿名方法
Lambda表达式:简化委托与匿名方法
-
Lambda表达式的核心价值
Lambda表达式是C#中简洁的匿名函数,用于快速创vb.net教程C#教程python教程SQL教程access 2010教程建委托实例或表达式树。它的核心作用是:
替代匿名方法:去掉冗余的delegate关键字,代码更简洁;
降低代码冗余:无需单独定义方法,直接在使用处编写逻辑;
提升可读性:将逻辑与调用点紧密结合,减少跳转。
Lambda的本质是编译器自动生成的匿名方法,但语法更紧凑,是现代C#开发中不可或缺的工具。
-
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; }
-
从匿名方法到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
核心简化:减少了50%以上的代码量,逻辑更直观。
-
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
}
}
-
基础知识拓展
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
示例:
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。
-
总结与练习
6.1 总结
Lambda表达式是C#中简化委托和匿名方法的利器,核心要点:
语法简洁:(参数) => 表达式/语句块;
与内置委托(Func/Action)结合使用,减少冗余;
闭包捕获外部变量(注意引用问题);
支持转换为表达式树,用于动态解析。
6.2 练习
实现以下功能,用Lambda表达式简化代码:
用List
用List
用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










