匿名方法/ Lambda(编码标准)

时间:2010-04-13 07:15:15

标签: linq lambda standards

在Jeffrey Richter的“CLR via C#”(.net 2.0 edtion page,353)中,他说作为一种自律,他永远不会使匿名函数的长度超过3行代码。他引用了大部分可读性/可理解性作为他的理由。这对我来说很好,因为我已经有一个自律使用不超过5行的匿名方法。

但是那个“编码标准”建议如何与lambda相提并论呢?从表面上看,我会同样对待它们 - 保持一个lambda同样短。但别人怎么看待这件事呢?特别是,当使用lambda时(可以说)它们在LINQ语句中使用时最明亮 - - 是否真的有理由放弃自律/编码标准?

2 个答案:

答案 0 :(得分:4)

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

Parallel.For(0, 100, i => 
{
    // Potentially significant amounts of code
});

对我而言,这是一个lambda表达式还是一个匿名方法并不重要 - 它实际上并没有像代表通常在.NET 2.0中那样使用。

在正常的LINQ中,我通常不会发现自己使用大型lambda表达式 - 当然不是语句的数量。有时单个表达式在 lines 方面会很长,因为它会投射许多属性;另一种选择是拥有巨大的线条!

事实上,LINQ倾向于支持单表达式lambda表达式(甚至没有括号)。我很惊讶地看到良好的使用了LINQ,它有一个带有5个语句的lambda表达式。

答案 1 :(得分:2)

我不知道是否有简短的lambda和委托的指南非常有用。但是,有一个简短功能的指导方针。我写的方法平均长6或7行。功能几乎不应该是20行。您应该创建最可读的代码,如果您遵循Robert Martin'sSteve McConnell's建议,它们会告诉您保持函数简短并且保持循环的内部部分尽可能短,有利的是只有一个方法调用

所以你不应该按如下方式编写for循环:

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

但只是在循环中使用单个方法调用:

for (int i = 0; i < 100; i++)
{
    WellDescribedOperationOnElementI(i);
}

考虑到这一点,虽然我总体上同意Jon Skeet的回答,但我认为你没有理由不想将他的例子写成:

Parallel.For(0, 100, i =>
{
    WellDescribedPartOfHeavyCalculation(i);
});

Parallel.For(0, 100, i => WellDescribedPartOfHeavyCalculation(i));

甚至:

Parallel.For(0, 100, WellDescribedPartOfHeavyCalculation);

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