我是C#的新手,早些时候我看到lambda表达式就像
(params) => { expression;}
但是在LINQ中,我看到了像
这样的例子IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName);
没有括号。
它们是相同还是有区别?
非常感谢。
答案 0 :(得分:25)
规则是:
lambda表达式的格式为
( modifier type parameter, modifier type parameter ...) => { statements }
让我们先考虑左侧。
修饰符可以是ref,out或者根本没有。
如果没有ref或out修饰符,则可以省略所有类型。如果任何 ref或out修饰符,则每个参数声明必须具有声明的类型。如果任何参数具有声明的类型,则每个参数必须具有声明的类型。因此,您可以忽略所提供的类型(1)没有参考或出局,以及(2)您忽略所有。否则,您必须提供所有类型。
如果确实存在一个参数并且其类型已被省略,那么参数列表周围的括号也可以选择省略。
这是关于参数列表的所有规则。关于右侧的规则是:
如果语句列表包含带有表达式的单个return语句:
x => { return x + 1; }
然后可以省略括号,返回关键字和分号:
x => x + 1
此外,如果语句列表由单个语句组成,该语句是语句表达式:
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.
然后删除大括号和分号也是合法的:
x => x++
x => new Y(x)
x => M(x)
请注意,这些可能意味着与读者不同的东西!在我们明确丢弃返回值之前;现在lambda将被读作返回它们。
请注意,这意味着使用void返回方法执行此操作是合法的。这实际上是合法的:
x => Console.WriteLine(x)
呸。 不要这样做。如果你的意思是
x => { Console.WriteLine(x); }
然后说出来。前者看起来太像你试图说的那样
x => { return Console.WriteLine(x); }
当然这是非法的。
答案 1 :(得分:15)
你在谈论哪些括号? (
)
或{
}
?
(
)
在参数列表中使用,并且在您有多个参数时是必需的:
(a, b, c) => ...
只有一个参数时,可以省略它们:
a => ...
{
}
允许您在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;
}
没有它们,lambda表达式的主体是表达式:
(a, b, c) => a * b + c
答案 2 :(得分:5)
如果您有多个参数,则只需要括号。
更新(按照惯例,在其他人回答之后编辑答案时就是这样......)
使用括号(括号“()”和大括号“{}”)这种情况是多余的。这些陈述是等同的。像ReSharper这样的Visual Studio加载项会指出这样的冗余: