我最近使用ReSharper启动。
ReSharper建议将所有循环转换为集合(通常为foreach
)到Linq
语句,即使循环包含各种条件。
一般来说,我应该在什么时候遵循ReSharper建议,什么时候不应该?
答案 0 :(得分:9)
这会提高性能吗?
一般来说,它不会影响性能。可以设计使用LINQ改善或降低性能的情况,但在一般情况下则不然。
这是否使代码更具可读性?
很多时候是的,因为它取代了强调迭代的 mechanics 的构造,并强调了迭代的目的。
强调力学:
var jacks = new List<Person>();
foreach (var person in persons)
{
if (person.Name == "Jack")
{
jacks.Add(person);
}
}
“此代码遍历人员,每次找到名为Jack的人时,都会添加它们 列表名为jacks“。
强调目的:
var jacks = persons.Where(p => p.Name == "Jack").ToList();
“把所有名字都是杰克的人放到一个清单中。我们将把这个名单称为杰克。”
第二个版本要短得多也没有什么坏处,所以你的大脑可以比第一个版本更容易消耗它。
另一个例子:
var furryAnimals = furryThings.Intersect(animals).ToArray();
如果没有LINQ或编写自己的等效内容,绝对没有办法匹配清晰度。这里很明显furryAnimals
包含furryThings
和animals
中的所有内容。这就是你所关心的一切。
您不关心如何计算这些集合的交集。计算可能涉及字典作为实现细节。但是,从创建该字典开始的代码的替代版本会立即引起您对最不重要的事情的关注:实现细节。
一般来说,我应该在什么时候遵循ReSharper的建议, 什么时候不应该?
规则总是有例外,所以我不会尝试在这里提出一个。但总的来说,我们希望代码是正确的,可维护的和快速的(通常按顺序)。我将假设代码是正确的,所以无论何时你必须做出决定,总是要考虑:
如果你有具体证明,代码的速度至关重要,也请考虑:
答案 1 :(得分:1)
答案是个人的。
LINQ不会自动使您的代码更快。相反的情况更可能是真的。看看:http://geekswithblogs.net/BlackRabbitCoder/archive/2010/04/23/c-linq-vs-foreach---round-1.aspx
LINQ可以缩短你的代码。
LINQ可以使您的代码更具可读性。但有时LINQ也可以有非常复杂的组合,然后我选择“旧”的方式。
答案 2 :(得分:1)
Resharper没有考虑转换为LINQ的代码的可读性。因此,它可以生成非常复杂的表达式,这些表达式比经典循环更难理解。
转换为LINQ代码本身不会改变性能,因此它更像是代码风格的首选项。
答案 3 :(得分:0)
LINQ使代码更具可读性,但在大多数情况下,可读性会带来性能成本。原因是lamdbas(匿名委托)是必须在内存中分配的类,以及之后收集的垃圾。好吧,CLR试图变得聪明并在可能的情况下缓存代表,但不幸的是,这还不够。此外,lamdba调用比简单的方法调用慢一点。
这就是为什么ReSharper可以做到这两点:将代码转换为LINQ并将LINQ转换为代码。当您关心可读性时,将所有内容转换为LINQ。当您关心性能时,请设置低检查优先级以转换为LINQ,并在您看到时将LINQ转换为代码。通常我首先将代码编写为LINQ,然后使用ReSharper将其转换为代码。真的可以节省时间。