代码之家  ›  专栏  ›  技术社区  ›  Codeslayer

匿名方法(C 2.0)和lambda表达式(C 3.0)有什么区别?[复制品]

  •  40
  • Codeslayer  · 技术社区  · 16 年前

    这个问题已经有了答案:

    两者有什么区别 匿名方法 C 2和 lambda表达式 C?3??

    4 回复  |  直到 16 年前
        1
  •  28
  •   Brian R. Bondy    16 年前

    The MSDN page on anonymous methods explains it

    在2.0之前的版本中,只有 声明委托的方法是使用 命名方法。引入C 2.0 匿名方法以及C 3.0和 稍后,lambda表达式将取代 匿名方法作为首选方法 编写内联代码。然而, 中有关匿名方法的信息 本主题也适用于lambda 表达。有一个案例 匿名方法提供的 在lambda中找不到功能 表达。匿名方法启用 省略参数列表,以及 这意味着匿名方法 可以转换为具有 各种签名。这不是 可以使用lambda表达式。为了 更多关于 lambda表达式,请参见lambda 表达式(C编程指南)。

    And regarding lambda expressions :

    lambda表达式是一个匿名函数,可以包含表达式和语句,并且可以用于创建委托或表达式树类型。 所有lambda表达式都使用lambda运算符=>,它被读取为“转到”。lambda运算符的左侧指定输入参数(如果有),右侧保留表达式或语句块。lambda表达式x=>x*x为“x到x乘以x”。此表达式可分配给委托类型,如下所示:

        2
  •  27
  •   Jon Skeet    16 年前
    1. lambda表达式可以转换为委托或表达式树(有一些限制);匿名方法只能转换为委托
    2. lambda表达式允许对参数进行类型推理:
    3. lambda表达式允许将正文截断为不带大括号的表达式(返回值)或单个语句(在其他情况下)。
    4. lambda表达式允许在可以推断类型并且只有一个参数时将参数列表缩短为参数名称。
    5. 匿名方法允许在主体中不使用参数列表并且不会导致歧义时完全忽略该参数列表。

    最后一点是,我相信匿名方法相对于lambda唯一的好处。但是,创建一个类似字段的事件并没有OP订阅是很有用的:

    public event EventHandler Click = delegate{};
    
        3
  •  22
  •   Pop Catalin    16 年前
    1. 匿名方法基本上是没有名称的函数,可以创建闭包。
    2. lambda表达式是可转换为匿名方法和表达式树的构造,并且遵循比匿名方法更复杂的类型推断规则。

    Eric Lippert(C语言设计师)在他的博客中解释了或多或少细微差异的范围:

        4
  •  13
  •   Marc Gravell    16 年前

    第一,方便性:朗姆达更容易读写。

    第二,表达式:lambda可以编译为 任何一个 代表, 表达式树( Expression<T> 对于某些委托类型t,例如 Func<int,bool> )表达式树更令人兴奋,因为它是Linq进行进程外数据存储的关键。

    Func<int,bool> isEven = i => i % 2 == 0;
    Expression<Func<int,bool>> isEven = i => i % 2 == 0;
    

    请注意,带有语句体的lambda表达式只能编译为委托,而不能编译为委托 Expression S:

    Action a = () => { Console.WriteLine(obj.ToString()); };