栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C#基础:Lambda表达式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#基础:Lambda表达式

从委托的角度来看,Lambda表达式与匿名方法没有区别。在【C#基础:匿名方法】一文中,我使用了匿名方法来调用List的FindAll方法。从C# 3.0开始,在使用匿名方法的地方,完全可以用Lambda表达式来代替。Lambda表达式的定义方式为:“([参数列表]) => 表达式”。运算符“=>”是一种与赋值运算“=”具有相同优先级的右结合运算符,在英语里读作:“goes to”。

现在回过头来看我们的例子。下面的代码与【C#基础:匿名方法】一文中的代码具有相同的效果:

view plaincopy to clipboardprint?

  1. class Program   

  2. {   

  3.     static void Main(string[] args)   

  4.     {   

  5.         List names = new List();   

  6.         names.Add("Sunny Chen");   

  7.         names.Add("Kitty Wang");   

  8.         names.Add("Sunny Crystal");   

  9.   

  10.         List found = names.FindAll   

  11.             (   

  12.             // Lambda expression Implementation   

  13.             name => name.StartsWith(   

  14.                 "sunny",    

  15.                 StringComparison.OrdinalIgnoreCase)   

  16.             );   

  17.   

  18.         if (found != null)   

  19.         {   

  20.             foreach (string str in found)   

  21.                 Console.WriteLine(str);   

  22.         }   

  23.     }   

  24. }   

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

view plaincopy to clipboardprint?

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

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

view plaincopy to clipboardprint?

  1. class Program   

  2. {   

  3.     static void Main(string[] args)   

  4.     {   

  5.         // Lambda 表达式   

  6.         Func dele1 = n => n > 10;   

  7.         // Lambda 语句   

  8.         Func dele2 = (int n) => { return n > 10; };   

  9.         Console.WriteLine(dele1(16));   

  10.         Console.WriteLine(dele1(8));   

  11.     }   

  12. }   

两种定义方法同样可以正确地输出结果。请注意,当我们希望构建表达式树的时候,情况却完全不同了:

view plaincopy to clipboardprint?

  1. // ok   

  2. expression> expr1 = n => n > 10;   

  3. // error: cannot converted to an expression tree   

  4. expression> expr2 = (int n) => { return n > 10; };   

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

有关委托的高级话题以及表达式树的内容,我会在后面的文章中继续研究。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/231708.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号