《Effective C#》读书笔记——条目8:推荐使用查询语法而不是循环<C#语言习惯>

简介:

 查询语法(query syntax)可以让程序逻辑的表达由“命令式”转换为“声明式”。查询语法定义了想要的结果,而把具体实现交给其他的专门实现。使用查询语法(实现了查询表达式模式的方法语法也可以)要比传统的命令式循环结果更加清晰的表达你的意图。

  下面我们观察一个使用命令式方法填充一个数组,然后将其内容输出至控制台:

复制代码
 1   static void Main(string[] args)
 2         {
 3             int[] foo = new int[100];
 4             for (int num = 0; num < foo.Length; num++)
 5             {
 6                 foo[num] = num * num;
 7             }
 8             foreach (int i in foo)
 9             {
10                 Console.WriteLine(i);
11             }
12             Console.Read();
13         }
复制代码

 

编写命令式的代码需要关注具体的实现细节。但是如果采用查询语法,实现同样的功能,代码更加易于重用且易读,我们来看上面示例“声明式”的写法:

复制代码
 1   static void Main(string[] args)
 2         {
 3             //生成数组的工作交个一个查询完成
 4             int[] foo = (from n in Enumerable.Range(0, 100) select n * n).ToArray();
 5 
 6             //循环打印的工作交给一个数组的扩展方法来完成
 7             foo.ForAll((n) => Console.WriteLine(n.ToString()));
 8 
 9             Console.Read();
10         }
复制代码

我们看到在负责循环打印部分我们使用了一个扩展方法,这个扩展方法带来了更好的重用性,每次需要对一个序列的元素执行某个操作都可以使用ForAll()方法:

复制代码
 1 public static class Extensions
 2 {
 3     /// <summary>
 4     /// 为IEnumerable<T>类型添加扩展方法
 5     /// </summary>
 6     /// <typeparam name="T"></typeparam>
 7     /// <param name="sequence"></param>
 8     /// <param name="action"></param>
 9     public static void ForAll<T>(this IEnumerable<T> sequence, Action<T> action)
10     {
11         foreach (T item in sequence)
12         {
13             action(item);
14         }
15     }
16 }
复制代码

 

上面的实例比较简单,似乎看不出二者有多大的区别,在下面的实例中我们分别使用“命令式”和“声明式”来实现比较二者的区别 。

命令式:

View Code

 

声明式:

View Code

 我们可以看到随着编程任务的复杂:

  “命令式”版本变得越来越难以理解。如果仔细看的话,甚至都不会发现比较函数中参数被颠倒了(这是个错误),而这只是为了能够降序排列而已。要是没有任何注释和稳定,命令式代码将会更加难以阅读。”命令式“代码太过于强调实现目标所需要的详细步骤,以至于让人很容易陷入具体的细节中。

  “声明式”版本的最后一个实现,实际只是将以此过滤(where子句)、以此排序(orderby子句)和一个投射(select)组合起来。查询语法比循环结构能够提供更具组合性的API。查询语法很自然的将算法分解成小块代码,每一块代码静对序列中的元素进行单一操作。查询语法的延迟执行模式也让开发者能够将这些单一的操作组合成多步的操作,且只要一次遍历序列就可以完整执行,而循环语法结构则必须为每一步操作都创建临时的存储,或者为序列将要执行的每一批操作都创建专用的方法。

 

小节:

当你需要编写循环时,首先看看能否用查询语法实现,若是无法使用查询语法,那么再看看是否能以方法调用语法替代。这样写出的代码总会比命令式循环结构要简洁一些。

本文转自gyzhao博客园博客,原文链接:http://www.cnblogs.com/IPrograming/archive/2012/09/01/Effective_CSharp_08.html ,如需转载请自行联系原作者
相关文章
|
14天前
|
安全 编译器 程序员
C# 中 foreach 循环和 for 循环深度比较
为什么建议你多数情况下使用 foreach 进行遍历循环?看完你就明白了
|
1月前
|
Java C#
如何避免在C#循环中使用await
如何避免在C#循环中使用await
91 9
|
5月前
|
开发框架 .NET 程序员
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
33 0
|
6月前
|
C#
C# 循环与条件语句详解
使用 switch 语句选择要执行的多个代码块中的一个。 示例:
78 2
|
6月前
|
C#
C#基础语法(判断和循环)
C#基础语法(判断和循环)
55 1
|
6月前
|
C# 图形学
【Unity 3D】C#中while do while for foreach等循环语句的讲解(附测试代码)
【Unity 3D】C#中while do while for foreach等循环语句的讲解(附测试代码)
231 0
|
11月前
|
C#
C# for和foreach两种循环的效率问题
C# for和foreach两种循环的效率问题
《More Effective C# 》读书笔记 第一章
《More Effective C# 》读书笔记 第一章
【C#视频】for、while、do-while三种循环
【C#视频】for、while、do-while三种循环
|
7天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
20 3
下一篇
无影云桌面