【问题标题】:Lambda expression vs anonymous methods [duplicate]Lambda表达式与匿名方法[重复]
【发布时间】:2011-06-23 12:03:02
【问题描述】:

我想知道有什么区别。目前我正在学习这些东西,在我看来这些都是一样的:

delegate void X();

X instanceOfX;

instanceOfX = delegate() { code };

instanceOfX = () => { code };

另外,如果 lambda 更新,我应该只使用 lambda 而忘记匿名方法吗?

【问题讨论】:

  • 从语言演变的角度来思考。在 C# 1 中,我们有委托。在 C# 2 中,他们添加了匿名方法。 C# 3 添加了 lambda。更简单的方法来完成类似的任务。有关演变的更多信息,我建议您查看 C# In Depth 一书。

标签: c# lambda anonymous-methods


【解决方案1】:

是的,lambda 表达式只是非常特殊的匿名方法。

但是,存在一些深刻的差异。从 Eric Lippert 的 Lambda Expression vs. Anonymous Methods, Part One 开始,然后继续到 series 的其余部分。

【讨论】:

  • 那么它们有什么特别之处呢?
  • 它们有什么特别之处
  • @recursive 首先,一个主要区别是单行 Lambda 可以分配给表达式树,而匿名方法不能。
  • 我更喜欢匿名方法,我并不总是使用 linq,否则我喜欢使用 List 中的 FindAll。
【解决方案2】:

唯一的区别是 lambda 可以很容易地转换为 Expression<Func<void>>。委托纯粹只是方法/闭包,但 lambda 也可以分解为表达式树:

Expression<Func<int, int>> expr = x => x*2; // Expression tree
Func<int, int> fun = x => x*2;              // Function
delegate int MyDelegate(int x);             // Delegate
MyDelegate del = x => x*2;                  // Same as Function and Delegate

【讨论】:

  • 请注意,这仅适用于 lamdas 的子集:Expression-lamdas 但不是语句 lamdas。
  • 请注意,“Delegate”对于委托类型来说是一个糟糕的名称,因为它很容易与 System.Delegate(它的基类)混淆。
  • 我很抱歉。今天早上我还在喝咖啡,老实说我想不出另一个名字
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2016-10-11
  • 2013-04-24
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多