10
25
2015
0

[Effective C#] Item 8: Prefer Query Syntax to Loops


像其他语言一样,C#提供了一组循环控制结构(for, while, do while, foreach),但实际上,在进行序列操作时,LINQ查询语句往往是更好的选择。

相对于C#本身的指令式编程模型,LINQ语法提供了一个声明式的模型。使用声明式编程范式的代码更侧重于要让计算机做什么(What),而不是如何去完成这件事(How),它往往比指令式代码更易编写且更清晰易懂。

下面是一个简单的例子。

即使在这样一个简单的例子中,指令式代码也过多地关注了如何执行这个操作而不是要执行什么操作。

也许现在它们的区别还不是很明显,那么现在来看一个较为复杂的例子。

现在很明显了,使用了LINQ的代码要比一般的指令式代码清晰很多。如果看得快一些,甚至有可能忽略掉第一份代码中point1和point2是反着比较的,这是为了进行降序排列。显然,在没有注释或其他文档的情况下,第一份代码的可读性要差很多。

LINQ的另一个优势是它的延迟执行模型,它很自然引导开发者创建小的算法块并在查询时仅枚举一遍序列。相比之下,循环语句则要在每一步都使用临时存储。

另外值得一提的是,C#同时还提供了LINQ语句的方法调用版本,下面是与第二个例子等价的代码。

方法调用在某些情况下会比LINQ语句可读性更高,同时,Take, TakeWhile, Skip, SkipWhile, Min, Max这些方法没有等价的LINQ版本,所以只能使用方法调用了。

最后要提的是LINQ的效率问题。相同的LINQ代码往往比循环代码执行地更慢,所以在查询成为性能瓶颈时,还是要使用循环语句的。不过,在使用循环语句前,可以考虑使用AsParallel()方法进行并行查询来提高LINQ的执行速度。

Category: 题解 | Tags: Effective C# | Read Count: 305

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com