也可以表示Lambda语句

时间:2022-02-09 08:48:56

从委托的角度来看,Lambda表达式与匿名要领没有区别。在前面

一文中,我们使用了匿名要领来挪用List<T>的FindAll要领。从C# 3.0开始,在使用匿名要领的处所,完全可以用Lambda表达式来取代。Lambda表达式的界说方法为:“([参数列表]) => 表达式”。运算符“=>”是一种与赋值运算“=”具有不异优先级的右结合运算符,,在英语里读作:“goes to”。

此刻回过头来看我们的例子。下面的代码与之前

一文中的代码具有不异的效果:

class Program { static void Main(string[] args) { List<string> names = new List<string>(); names.Add("Sunny Chen"); names.Add("Kitty Wang"); names.Add("Sunny Crystal"); List<string> found = names.FindAll ( // Lambda Expression Implementation name => name.StartsWith( "sunny", StringComparison.OrdinalIgnoreCase) ); if (found != null) { foreach (string str in found) Console.WriteLine(str); } } }

上面的Lambda Expression Implementation在效果上与匿名要领没有任何区别,“=>”左边的name界说了参数(当参数个数为1的时候,圆括号可以省略),“=>”右边界说执行体。由于C# 3.0编译器具有Type Inference的能力,参数类型与返回值都将由编译器通过上下文判定,因此与匿名要领差别,Lambda表达式的参数可以不给定参数类型。当所暗示的匿名要领没有任何参数时,Lambda表达式也同样可以使用,只需在“=>”左边用一对圆括号暗示即可。即:

() => Console.WriteLine("Hello!");

事实上,“Lambda表达式”这一词对照笼统,事实上“=>”运算符既可以暗示Lambda表达式,也可以暗示Lambda语句。Lambda语句由代码块构成,形式上很像匿名要领。请看下面的例子:

class Program { static void Main(string[] args) { // Lambda 表达式 Func<int, bool> dele1 = n => n > 10; // Lambda 语句 Func<int, bool> dele2 = (int n) => { return n > 10; }; Console.WriteLine(dele1(16)); Console.WriteLine(dele1(8)); } }

两种界说要领同样可以正确地输出功效。请注意,当我们但愿构建表达式树的时候,情况却完全差别了:

// ok Expression<Func<int, bool>> expr1 = n => n > 10; // error: cannot converted to an expression tree Expression<Func<int, bool>> expr2 = (int n) => { return n > 10; };

由此可见,在构建表达式树的时候,不能用Lambda语句(带有代码语句的Lambda表达式),而应该使用Lambda表达式。从这里就可以看出匿名要领与Lambda表达式的区别了。