我是C#的新手,早些时候我看到了lambda表达式
(params) => { expression;}
Run Code Online (Sandbox Code Playgroud)
但是在LINQ中,我看到了类似的例子
IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName);
Run Code Online (Sandbox Code Playgroud)
没有括号.
它们是相同的还是有什么区别?
非常感谢.
Eri*_*ert 25
规则是:
lambda表达式具有形式
( modifier type parameter, modifier type parameter ...) => { statements }
Run Code Online (Sandbox Code Playgroud)
我们先考虑左侧.
修饰符可以是ref,out或者根本没有.
如果没有ref或out修饰符,则可以省略所有类型.如果有任何 ref或out修饰符,则每个参数声明必须具有声明的类型.如果任何参数具有声明的类型,则每个参数必须具有声明的类型.因此,您可以忽略以下类型:(1)没有参考或出局,以及(2)您忽略所有类型.否则,您必须提供所有类型.
如果只有一个参数并且其类型已被省略,那么也可以选择省略参数列表周围的括号.
这是关于参数列表的所有规则.关于右侧的规则是:
如果语句列表包含带有表达式的单个return语句:
x => { return x + 1; }
Run Code Online (Sandbox Code Playgroud)
然后可以省略大括号,返回关键字和分号:
x => x + 1
Run Code Online (Sandbox Code Playgroud)
此外,如果语句列表由作为语句表达式的单个语句组成:
x => { x++; } // Not returning the value of x++; only useful for the side effects
x => { new Y(x); } // weird! executing a ctor only for its side effects! But legal!
x => { M(x); } // note, not returning the value of M(x) even if there is one.
Run Code Online (Sandbox Code Playgroud)
那么删除大括号和分号也是合法的:
x => x++
x => new Y(x)
x => M(x)
Run Code Online (Sandbox Code Playgroud)
请注意,这些可能意味着与读者不同的东西!在我们清楚地丢弃返回值之前; 现在lambdas将被视为返回它们.
请注意,这意味着使用void返回方法执行此操作是合法的.这实际上是合法的:
x => Console.WriteLine(x)
Run Code Online (Sandbox Code Playgroud)
呸.不要那样做.如果你的意思是
x => { Console.WriteLine(x); }
Run Code Online (Sandbox Code Playgroud)
然后说出来.前者看起来太像你想说的那样
x => { return Console.WriteLine(x); }
Run Code Online (Sandbox Code Playgroud)
这当然是非法的.
dtb*_*dtb 15
你在谈论哪些括号?( )还是{ }?
( ) 在参数列表中使用,当您有多个参数时,它们是必需的:
(a, b, c) => ...
Run Code Online (Sandbox Code Playgroud)
只有一个参数时,可以省略它们:
a => ...
Run Code Online (Sandbox Code Playgroud)
{ }允许您在lambda表达式的主体中放置一个语句块:
(a, b, c) => {
Console.WriteLine("Hello World!");
Console.WriteLine("a = {0}", a);
Console.WriteLine("b = {0}", b);
Console.WriteLine("c = {0}", c);
return a * b + c;
}
Run Code Online (Sandbox Code Playgroud)
没有它们,lambda表达式的主体就是一个表达式:
(a, b, c) => a * b + c
Run Code Online (Sandbox Code Playgroud)
如果您有多个参数,则只需要括号.
更新(按照惯例,在其他人回答后编辑答案时,如此...)
使用括号(括号"()"和大括号"{}")这种情况是多余的.这些陈述是等同的.像ReSharper这样的Visual Studio加载项会指出这样的冗余:
http://www.jetbrains.com/resharper/