在现代编程语言中,Lambda表达式已经成为一个不可或缺的组成部分,特别是在C#中。Lambda表达式是一种匿名函数,它允许开发者以简洁的语法定义函数,并将其作为参数传递给其他函数或作为函数调用的返回值。本文将详细介绍Lambda表达式的基本概念、语法、应用场景,以及它在C#中的历史和发展。
Lambda表达式的概念最早可以追溯到1936年,由美国数学家阿隆佐·丘奇(Alonzo Church)提出。自那时起,Lambda表达式在计算机语言中的应用逐渐普及,尤其是在函数式编程语言中。C#从3.0版本开始正式支持Lambda表达式,为开发者提供了一种更加简洁和强大的编程方式。
在深入讨论Lambda表达式之前,先简要介绍另一个相关的概念——匿名类型。匿名类型提供了一种方便的方式来封装只读属性到单个对象中,而无需为这个对象定义一个显式的类型。编译器在编译时会为匿名类型生成一个名称,但这个名称对开发者是不可见的。匿名类型通常与LINQ和Lambda表达式结合使用,以提供强大的数据处理能力。
以下是一个使用匿名类型的示例代码:
Console.WriteLine("-----------ANONYMOUS TYPES----------------");
var anonym1 = new { int_val = 1, double_val = 0.11, string_val = "some string" };
Console.WriteLine("anonym1 type is: " + anonym1.GetType());
Console.WriteLine("double_val type is: " + anonym1.double_val.GetType());
Console.WriteLine("int_val type is: " + anonym1.int_val.GetType());
Console.WriteLine("string_val type is: " + anonym1.string_val.GetType());
匿名类型有一些限制,例如它们只能有公共的只读属性,没有方法或其他类型的成员,只能被转换为对象类型。如果两个匿名类型有相同的定义,编译器会将它们视为相同的类型,并共享相同的元数据。
构建Lambda表达式时,需要使用Lambda操作符"=>"。这个操作符将输入变量与左侧的Lambda主体分隔开。Lambda表达式可以写成以下两种形式之一:
<arguments if any> => <expression>
或
<arguments if any> => <statement block>
在Lambda表达式出现之前,匿名方法被设计用来传递给期望委托的函数。Lambda表达式提供了一种更具体的语法,使得匿名方法作为委托更加有用,尤其是在LINQ查询表达式中,它们允许编写紧凑的方法,这些方法可以作为参数传递给后续的评估。
以下是一个使用Lambda表达式替换委托的示例:
public delegate int MyDelegate(string s, int i);
public static void DelegateCaller(MyDelegate input)
{
int res = input("Delegate Caller", 5);
Console.WriteLine("Delegate result is: " + res);
}
public static int DelegateFunction(string s, int i)
{
Console.WriteLine("Delegate function string: " + s + " int: " + i);
return 1;
}
Console.WriteLine("-----------LAMBDA EXPRESSIONS----------------");
DelegateCaller(new MyDelegate(DelegateFunction));
MyDelegate del = (str, dig) =>
{
Console.WriteLine("Delegate lambda string: " + str + " int: " + dig);
return 2;
};
DelegateCaller(new MyDelegate(del));
在Lambda表达式中,如果需要传递多个参数,可以使用括号将参数括起来:
(car, engineSize) => car.engine >= engineSize
为了避免混淆,可以为参数指定类型:
(ClassCar car, int engineSize) => car.engine >= engineSize
如果Lambda表达式没有参数,可以省略参数列表:
() => Console.WriteLine("Parameter less lambda");
如果Lambda表达式体中有多个语句,它们应该放在花括号中:
x => {
Console.WriteLine("Few statements lambda");
return x * x;
}
可以在Lambda表达式体中使用局部变量,这些变量只在Lambda表达式内部可见:
x => {
DateTime date = DateTime.Now;
return x + date.DayOfYear;
}