Linq 匿名方法/Lambda';s(编码标准)

Linq 匿名方法/Lambda';s(编码标准),linq,lambda,standards,Linq,Lambda,Standards,杰弗里·里克特(Jeffrey Richter)在其《通过C#的CLR》(the.net 2.0 edtion page,353)一书中说,作为一种自律,他从不使用长度超过3行代码的匿名函数。他以可读性/可理解性为理由。这对我来说很合适,因为我已经有了一个自律,在匿名方法中使用的行数不超过5行 但“编码标准”的建议如何与lambda的建议相提并论呢?从表面上看,我会对它们一视同仁——保持一个λ同样短。但其他人对此有何看法?特别是,当lambda在(可以说)它们最亮的地方使用时(在LINQ语句中使

杰弗里·里克特(Jeffrey Richter)在其《通过C#的CLR》(the.net 2.0 edtion page,353)一书中说,作为一种自律,他从不使用长度超过3行代码的匿名函数。他以可读性/可理解性为理由。这对我来说很合适,因为我已经有了一个自律,在匿名方法中使用的行数不超过5行


但“编码标准”的建议如何与lambda的建议相提并论呢?从表面上看,我会对它们一视同仁——保持一个λ同样短。但其他人对此有何看法?特别是,当lambda在(可以说)它们最亮的地方使用时(在LINQ语句中使用时),是否有真正的理由放弃自律/编码标准?

请记住,自2.0以来,情况发生了很大变化。例如,考虑.NET 4的并行扩展,它大量使用委托。您可能有:

Parallel.For(0, 100, i => 
{
    // Potentially significant amounts of code
});
对我来说,这是一个lambda表达式还是一个匿名方法并不重要——它的使用方式与.NET2.0中典型的委托不同

在普通LINQ中,我通常不会使用大型lambda表达式——当然不会使用语句的数量。有时,一个特定的表达式在线条上相当长,因为它投射了许多属性;另一种选择是有巨大的线


事实上,LINQ倾向于使用单表达式lambda表达式(甚至没有大括号)。我会相当惊讶地看到LINQ的良好使用,它有一个lambda表达式,在中有5个语句。

我不知道是否有一个简短lambda和委托的指南真的有用。但是,要有一个简短功能的指南。我写的方法平均有6或7行长。函数不应该有20行长。您应该创建可读性最高的代码,如果您遵循或建议,它们会告诉您保持函数简短,并尽可能缩短循环的内部部分,最好只进行一次方法调用

因此,不应按如下方式编写for循环:

for (int i = 0; i < 100; i++)
{
    // Potentially significant amounts of code
}

甚至:

Parallel.For(0, 100, WellDescribedPartOfHeavyCalculation);

总是选择可读性最好的代码,很多时候这意味着:简短的匿名方法和简短的lambda方法,但最重要的是简短但描述良好的方法。

你的回答对我来说很讽刺。如果我刚才猜到了,我可能会想象响应者最多会说“lambda应该比函数长或短”而不是“lambda短,函数更短”。是什么让函数比lambda更难读取?因为lambda通常是方法的一部分,所以实际上不可能使方法比lambda短。方法并不比lambdas难读。不,我认为过度使用lambdas可能会降低代码的可读性。有着强大的力量,yada yada。所以我想你是说,99%的时候,如果考虑到LINQ的“良好”使用,你会认为lambdas是短的(例如,通常是3行或更少)。相反,你所说的“有时相当长”是什么意思?你是说在1%的情况下,你会发现一个lambda合法地有20多个代码行长吗?哦,等等,我明白了。您将“分号”作为语句,类似于流畅的API用法的东西作为“行”对于“Parallel.For”,什么是“大量代码”?120份声明?10份声明?在该lambda中具有“潜在大量代码”的价值是什么?为什么不遵循史蒂文在本主题中发表的建议?@Mystagogue:这是个人品味的问题。在我看来,10条语句通常可以,但120条语句无论如何都应该重构。。。请注意,lambdas还可以在上下文中捕获局部变量,这在其他地方可能很难做到。
Parallel.For(0, 100, i =>
{
    WellDescribedPartOfHeavyCalculation(i);
});
Parallel.For(0, 100, i => WellDescribedPartOfHeavyCalculation(i));
Parallel.For(0, 100, WellDescribedPartOfHeavyCalculation);