lambda表达式的写法符号是“=>”,简称为:goes to,如:x=>x+x、x=>{1+1},左边是参数,右边是一个方法体,只是省去了发括号,lambda表达式可以创建委托、表达式树的匿名函数,使用起来比匿名函数更加简洁。lambda表达式符号是一个右结合运算,与“=”有相同等级的优先级。
下面我们来试试
//定义一个委托
delegate bool D();
class Program
{
//申明委托
static D dev;
static void Main(string[] args)
{
//使用lambda
dev = ()=>{ return true; };
dev = () => true;
//不可以直接赋值
//dev =true;
Console.Write(dev());
Console.Read();
}
}
lambda表达式跟匿名函数一样可以使用外部参数
int i =2;
dev =()=>i>0;
lambda表达式参数使用范围:
1、捕获的变量将不会被作为垃圾回收,直至引用变量的委托符合垃圾回收的条件。
2、在外部方法中看不到 lambda 表达式内引入的变量。
3、Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。
4、Lambda 表达式中的返回语句不会导致封闭方法返回。
5、如果跳转语句的目标在块外部,则 lambda 表达式不能包含位于 lambda 函数内部的 goto 语句、break 语句或 continue 语句。 同样,如果目标在块内部,则在 lambda 函数块外部使用跳转语句也是错误的。
使用lambda表达式查询
static void Main(string[] args)
{
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var counts = numbers.Count(n => n % 2 == 1);
var list = numbers.Where(t => t % 2 == 1);
Console.WriteLine(counts);
Console.Read();
}
许多标准查询运算符都具有输入参数,其类型是泛型委托系列 Func 中的一种。 这些委托使用类型参数来定义输入参数的数量和类型,以及委托的返回类型。我们鼠标放到count和where上面去就发现他们的参数是一个Func<int, bool>,其中int是输入参数,bool是返回类型。
lambda类型推理
在编写 lambda 时,通常不必为输入参数指定类型,因为编译器可以根据 lambda 主体、参数的委托类型以及 C# 语言规范中描述的其他因素来推断类型。
Lambda 的一般规则如下:
1、Lambda 包含的参数数量必须与委托类型包含的参数数量相同。
2、Lambda 中的每个输入参数必须都能够隐式转换为其对应的委托参数。
3、Lambda 的返回值(如果有)必须能够隐式转换为委托的返回类型。