zoukankan      html  css  js  c++  java
  • C#基础:Lambda表达式

    从委托的角度来看,Lambda表达式与匿名方法没有区别。在【C#基础:匿名方法】一文中,我使用了匿名方法来调用List<T>的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<string> names = new List<string>();   
    6.         names.Add("Sunny Chen");   
    7.         names.Add("Kitty Wang");   
    8.         names.Add("Sunny Crystal");   
    9.   
    10.         List<string> 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<intbool> dele1 = n => n > 10;   
    7.         // Lambda 语句   
    8.         Func<intbool> 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<Func<intbool>> expr1 = n => n > 10;   
    3. // error: cannot converted to an expression tree   
    4. Expression<Func<intbool>> expr2 = (int n) => { return n > 10; };   

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

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

  • 相关阅读:
    C语言与内存模型初探
    【编辑中】软件工程知识萃取
    【深入理解计算机系统01】不同层级程序指令间的转换
    【统计学中的普适智慧】假设检验
    windows 内部预览版与迅雷极速版不配合
    网络安全理论初涉
    Unix philosophy
    BOP 2016 复赛题目
    10.8做题——USACO1.2命名那个数字(Name That Number)
    10.6上课——problem1切割木板(USACO 2006 November Gold)
  • 原文地址:https://www.cnblogs.com/daxnet/p/1687010.html
Copyright © 2011-2022 走看看