让我们有一个具有以下签名的方法:
A[] Translate(IEnumerable<B> bees)
我想知道以下片段之一是否会以任何实际的方式导致更好的执行。
if (bees == null || !bees.Any()) // Let's be super expressive
{
return null;
}
var translated = bees.Select(b => (...)).ToArray();
return translated; // Intermediate var so that I can debug easier
与。
if (bees == null) // Let's be very expressive
{
return null;
}
var translated = bees.Select(b => (...)).ToArray();
return translated; // Intermediate var so that I can debug easier
与。
return bees?.Select(b => (...)).ToArray();
更新 16/09:我使if
返回 null,而不是一个新数组(这对我的问题精神来说并不重要(
假设Any()
速度很快,第一个应该比第二个稍微便宜一些,因为当bees
为空时,堆分配会更少(特别是 Select 枚举器和 lambda 表达式(。第三种选择相当于第二种选择。
但是,如果bees
是像数据库查询这样具有较大启动成本的东西,那么调用Any()
实际上可能很慢,并且避免Select(...).ToArray()
空查询所带来的收益可能会被同时调用Any()
和Select(...).ToArray()
对非空查询造成的损失所抵消。
我建议以最易读的方式编写此内容,除非您有令人信服的理由进行此性能优化,并且备份的数据表明它实际上提高了用例的性能。