表达式lambda和语句lambda之间的区别

ckv*_*ckv 27 c# linq lambda anonymous-function c#-4.0

表达式lambda和语句lambda之间有区别吗?

如果是这样,有什么区别?

在下面的链接中发现了这个问题,但无法理解答案什么是Expression Lambda?

C#面试问题

该链接中提到的答案是这个 带有右侧表达式的lambda表达式称为表达式lambda.

根据我的理解,表达式始终只在右侧.这就是我提出这个问题的原因.有什么我不知道的吗?

Eri*_*ert 44

这确实令人困惑的行话; 我们无法想出更好的东西.

一个lambda表达式是包罗万象的术语,任何这些:

x => M(x)
(x, y) => M(x, y)
(int x, int y) => M(x, y)
x => { return M(x); }
(x, y) => { return M(x, y); }
(int x, int y) => { return M(x, y); }
Run Code Online (Sandbox Code Playgroud)

前三个是表达式lambdas,因为lambda运算符的右侧是表达式.最后三个是语句lambda,因为lambda运算符的右边是一个.

这也说明左侧有三种可能的语法:单个参数名称或无类型参数的括号列表,或带括号的参数列表.

  • @ckv当编译成`Func <T>`时,不是真的.当编译成`Expression <Func <T >>时,是的.例如,一些解析表达式的查询提供程序无法处理语句lambdas,或者必须在特定上下文中使用语句lambdas等.简而言之,创建的表达式树根本不同,无论谁"使用"它都可能关心很多那些细节.对于一个简单的`Func <T>`,当你调用它时运行的底层代码是(希望)一个你不需要担心的抽象. (4认同)
  • @Servy除了你不能将语句lambda转换为`Expression`.你*可以*创建一个表达语句的`Expression`(自.Net 4.0起),但你必须手动使用表达式树API. (3认同)
  • 这就是全部区别吗?块内的语句和语句。 (2认同)

Chi*_*ils 16

是的 - 或者我应该说一个定义另一个.

一个lambda表达式允许你指定简单的匿名函数.

一个表达式拉姆达 是一个类型,其具有以拉姆达运算符右侧的表达拉姆达.

另一种类型的lambda表达式是一个语句lambda,因为它包含一个语句块{...}到表达式的右侧.

  • 表达式lambda采用以下形式: number => (number % 2 == 0)
  • 语句lambda采用以下形式: number => { return number > 5 }

  • @FrédéricHamidi正确.语句lambdas和expression lambdas是两种不同类型的lambda表达式.lambda要么包装语句,要么包含表达式.生成的lambda本身就是一个表达式(无论它包裹的是哪一个). (3认同)
  • @millimoose,我的英语很可能再次让我失望。发问者提到的文章将表达式lambda(相对于语句lambdas)区别为仅包含单个表达式的主体的lambda。IIRC“表达式” lambda可以分配给“ Expression &lt;Func &lt;T &gt;&gt;”,但“声明” lambda不能。 (2认同)

svi*_*ick 9

一个lambda表达式是一个语法,可以让你没有名字直接创建您的代码中的功能,作为一种表达.

有两种lambda表达式,具体取决于它们的主体:

  • 表达lambda,其身体只是一个表达,例如(i, j) => i + j
  • 声明lambdas,其正文是完整的陈述,例如.(i, j) => { return i + j; }