LINQ和Lambda表达式是否降低圈复杂度?

LINQ和Lambda表达式是否降低圈复杂度?,linq,lambda,cyclomatic-complexity,Linq,Lambda,Cyclomatic Complexity,LINQ和Lambda表达式是否降低圈复杂度?只是好奇,因为当VS分析器增加cc时,CodeRush实际上显示cc减少。我怀疑这种差异可能是由于延迟执行造成的。当您将LINQ与lambda表达式一起使用时,您指定的代码将在迭代集合时运行 就我个人而言,我并不担心圈复杂度,但我绝对相信(如果使用得当)LINQ会提高可读性。这就是我真正关心的:)我只是提出了同样的问题,事实上,lambda可以增加圈复杂度我做了测试,Where()子句可以合理地增加它。 可读性确实是您的首要任务之一。 但是用Get(

LINQ和Lambda表达式是否降低圈复杂度?只是好奇,因为当VS分析器增加cc时,CodeRush实际上显示cc减少。

我怀疑这种差异可能是由于延迟执行造成的。当您将LINQ与lambda表达式一起使用时,您指定的代码将在迭代集合时运行


就我个人而言,我并不担心圈复杂度,但我绝对相信(如果使用得当)LINQ会提高可读性。这就是我真正关心的:)

我只是提出了同样的问题,事实上,lambda可以增加圈复杂度我做了测试,Where()子句可以合理地增加它。

可读性确实是您的首要任务之一。

但是用Get()方法代替一些LinQ查询并没有花多长时间,它为我提供了相同的数据和额外的好处


我在构建/发布脚本中保持Fxcop,因此在部署某些东西时,必须达到圈复杂度为25的目标

这很难,但我认为值得努力

这让我在讨论中获得了一些观点,当我的同伴们带着一个非常糟糕的代码说: 这是有效的,这才是重要的


我的建议是:将圈复杂度保持在25以下。
这可能会帮助您保持每个方法足够简单,以便进行良好的维护。

Jon Skeet非常简洁地回答了这个问题。我想补充一点,在我使用C#等高级语言的经验中,度量圈复杂度的价值降低了,因为像LINQ这样的语法糖包为开发增加了价值

在过去的十年中,随着语言的发展,网络上的许多人已经证明圈复杂度和代码行之间有着很强的相关性,这使得他们中的许多人质疑这样一种度量方法究竟能带来多少价值。另一种看待它的方式是,作为代码质量度量的CC的贬值实际上是对可读性重要性的一种断言,因为一个经常与另一个相反

例如,如果我在foreach循环中放入一个条件,则该条件将作为我的代码进行计算,并计算适当数量的代码路径。另一方面,如果我对迭代的集合应用函数树(例如,Where(evalStr=>evalStr==origStr)我正在将条件转移到循环的外部并进入编译器生成的代码中。仍然有相同数量的分支,但是条件不是循环的一部分,但是CC增加到foreach循环之外,使用匿名方法(lambdas和委托)会受到“惩罚”Where函数允许我对迭代的集合进行预处理,以便循环只在需要时进行迭代

然而,代码的可读性远远高于此

最后,如果确定LINQ IQueryable函数中使用的布尔表达式不需要进行单元测试,表面上是因为如果存在异常,则这是一个高阶(也称为业务级)异常(测试的值错误、运算符错误、操作数错误等),而不是该语言的不理想使用(使用switch而不是if,if而不是三元等)然后度量圈复杂度应该考虑到这一点:A Where()函数不应该增加我的CC。度量圈复杂度无助于生成更好的代码;如果有的话,它会人为地增加开发人员在不需要或不需要简化的地方简化的倾向