Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表达式lambda和语句lambda之间的差异_C#_Linq_C# 4.0_Lambda_Anonymous Function - Fatal编程技术网

C# 表达式lambda和语句lambda之间的差异

C# 表达式lambda和语句lambda之间的差异,c#,linq,c#-4.0,lambda,anonymous-function,C#,Linq,C# 4.0,Lambda,Anonymous Function,表达式lambda和语句lambda之间有区别吗 如果是,有什么区别 在下面的链接中找到此问题,但无法理解答案 什么是Lambda 该链接中提到的答案是 右侧有表达式的lambda表达式称为表达式lambda。 根据我的理解,表达总是只在右手边。这就是我问这个问题的原因。有什么我不知道的吗?是的,有——或者我应该说一个定义了另一个 lambda表达式允许您分配简单的匿名函数 表达式lambda是一种lambda类型,在lambda运算符的右侧有一个表达式 另一种类型的lambda表达式是语句l

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

如果是,有什么区别

在下面的链接中找到此问题,但无法理解答案 什么是Lambda

该链接中提到的答案是 右侧有表达式的lambda表达式称为表达式lambda。


根据我的理解,表达总是只在右手边。这就是我问这个问题的原因。有什么我不知道的吗?

是的,有——或者我应该说一个定义了另一个

lambda表达式允许您分配简单的匿名函数

表达式lambda是一种lambda类型,在lambda运算符的右侧有一个表达式

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

  • 表达式lambda的形式为:
    number=>(number%2==0)
  • 语句lambda的形式为:
    number=>{returnnumber>5}

lampda expression是一个匿名函数,编译器可以将其转换为
Func
表达式(由编译器根据用法推断)


“表达式lamdba”的含义并不完全清楚,但如果您在播客/网络广播或其他内容中听到该短语,则可能是指lambda表达式。或者它可能是属性,用于从表达式实例获取lambda;我们想不出比这更好的了

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); }
前三个是表达式lambda,因为lambda运算符的右侧是表达式。最后三个是语句lambdas,因为lambda运算符的右侧是一个块

这还说明了左侧有三种可能的语法:单个参数名、非类型化参数的括号列表或类型化参数的括号列表

lambda表达式是一种语法,允许您直接在代码中创建一个没有名称的函数,作为表达式

lambda表达式有两种,具体取决于其主体:

  • 表达式lambdas,其主体只是一个表达式,例如
    (i,j)=>i+j
  • 语句lambdas,其主体是完整语句,例如..
    (i,j)=>{returni+j;}

您遇到这两个术语的来源将帮助我们解释差异(如果有的话)。您指的是
表达式。Lambda
方法调用吗?添加了我感到困惑的来源。来源实际上没有显示差异吗?@ckv它还显示了几个示例。它还描述了一个语句lambda,它是“相反的”。举几个例子。(虽然这个博客非常需要一个代码显示插件,而且看起来有点糟糕。)@millimoose,我的英语可能又让我不及格了。提问者提到的文章将表达式lambdas(与语句lambdas)区分为身体仅包含在单个表达式中的lambdas。IIRC“expression”lambdas可以分配给
expression
,但“statement”lambdas不能。@FrédéricHamidi更正。语句lambdas和表达式lambdas是两种不同类型的lambda表达式。lambda正在包装语句或表达式。由此产生的lambda本身就是一个表达式(不管它包装的是两个表达式中的哪一个)。@FrédéricHamidi感谢您的回答,尽管我在那里过于轻蔑。“谁的身体由谁组成”是一个更好的措辞,我被“返回表达式”弄糊涂了,因为我认为lambda是返回身体是什么的结果。@millimoose,这就是为什么我实际上说
计算表达式的原因,但我想这更让人困惑;)这就是区别吗?一个语句和块中的语句。@ckv编译成
Func
时,实际上不是。当编译成
表达式时,是。例如,一些解析表达式的查询提供程序无法处理语句lambda,或者在特定上下文中必须有语句lambda等等。简言之,创建的表达式树是完全不同的,使用它的人可能非常关心这些细节。对于一个普通的
Func
,调用它时运行的底层代码(希望)是一个您不必担心的抽象。@Servy除非您不能将语句lambda转换为
表达式。您可以创建一个表示语句的
表达式
(从.Net 4.0开始),但您必须手动使用表达式树API来实现这一点。您如何与一个回应C#说“…我们没有更好的了”的人竞争?@C.Lang:很简单,不要竞争;合作。我认为按照你的意愿为人民服务更具建设性。