16, 元素可变的情况下应避免用数组。

数组是定长的集合,可以考虑用ArrayList或List<T>集合。ArrayList元素是object类型,有装箱的开销,性能较低。另外Array类提供了Array.CreateInstance来创建数组,Array.Copy来拷贝数组,但这牵涉到新数组的创建,会增加开销。

17, 多数情况下用foreach代替for循环。

18, Foreach不能代替for。

Foreach不能对元素进行增删操作,不能访问序号。

19, 使用对象初始化器和集合初始化器。

这是在.net 3.5以后增加的语法,在Linq查询结果的匿名类上只能使用对象初始化器赋值。

20, 使用泛型集合替代非泛型集合。

类似于ArrayList这种非泛型集合,没有类型安全性检查,并伴随有装箱、拆箱等性能损耗。

21, 选择合适的集合。

List<T>平时用的最多,它追加数据比较快,但是插入和删除数据比较慢,因为插入点以后的数据要全部移动。LinkedList,这是双向链表,插入和删除数据都较快,它没有Add方法,只有AddAfter,AddFirst等方法。Dictionary<K,V>这是一个基于散列值的字典类,查询速度较快,不允许有重复的键值。HashSet<T>,这是集在.net中的实现,存储无序的不重复的元素,如你重复两次添加2进去,最后一次没有效果,但不会出错。根据前面几个基本类型,可以衍生出可以排序的SortedList,SortedDictionary,SortedSet。另外在多线程环境中使用的ConcurrentBag(对应List),ConcurrentDictionary,ConcurrentQueue,ConcurrentStack。

22, 确保集合的线程安全。

多线程访问同一集合,应考虑使用lock关键字对使用集合的代码进行锁定。或可以考虑上面提到的在多线程环境下使用的集合。

23, 避免将List<T>作为自定义集合类的基类。

应该以组合的方式将List<T>包含在自定义类中,然后扩展相应的泛型接口IEnumerable<T>和ICollection<T>(或ICollection<T>的子接口如IList<T>),前者规范了迭代行为,后者规范了集合的操作。原因是List<T>几乎没有提供可供子类复写的方法。如果要向Add方法中加入自己的逻辑,只能覆盖(new关键字)这个方法,而使用者并不知道我们改变了这个意图,他认为自定义类还是一个List<T>,结果就是添加的结果和他预想的不一致。

24, 迭代器应该是只读的。

集合的迭代行为应该是固定的,不能被随意改变。

25, 谨慎集合属性的可写操作。

集合属性的创建,应该由对象内部完成,外界只能访问这个集合,而不应该允许设置成其他的集合。可以对属性使用private set来控制。

26, 使用匿名类型存储Linq查询的结果。

匿名类型可以临时存储数据,避免代码膨胀,过度设计大量的自定义类。匿名类型支持智能感知,匿名类型和Linq搭配使用大有用途。

27, 在查询中使用Lambda表达式。

Linq本质上是使用扩展方法和Lambda表达式来实现的。Linq的大部分扩展方法都是针对Action,Func,Predicate这几个泛型委托的,而Lambda其实就是一个简洁的委托,它可以简化代码。=> 左边是函数的参数,右边是函数体。

28, 理解延迟求值和主动求职的区别。

Linq表达式是一种延迟求值,只有使用时才会正真的计算值,如foreach时,或者调用ToList()方法时。理解这一点很重要,可以避免一些不必要的计算开销。

29, 区别Linq查询中的IEnumerable<T>和IQueryable<T>。

Linq查询方法提供了两类扩展方法,一类放在System.Linq.Enumerable类中,一类放在System.Linq.Queryable中。Enumerable中的扩展方法是对本地集合进行查询,查询的参数是Func<>,适合于Linq to Objects。Queryable中的扩展方法参数是Expression<Func<>>表达式树,这是针对Linq to SQL的,表达式树会被翻译成对应的SQL文。

30, 使用Linq取代集合中的比较器和迭代器。

Linq的orderby等语法实质是调用了IEnumerable的扩展方法来进行排序,这比让类型实现IComparable接口或自定义ICompare接口有更好的扩展性,并且代码更加简洁。

31, 避免不必要的迭代。

这一点说明的是Linq查询的条件应更加具体,如我们只需要第一条数据,可以加一个First()方法,只需要前5条数据,可以加一个Take(5)方法。当满足我们设置的这些条件时,结果就会返回,从而避免不必要的后续迭代。

【进阶修炼】——改善C#程序质量(2)的更多相关文章

  1. 【进阶修炼】——改善C#程序质量(1)

    这是一个大纲形式的概要,以便自己可以花较少的时间反复阅读.在开发中,多加注意这些有用的建议,让自己成为一个更优秀的程序员.内容主要来自<编写高质量代码-改善C#程序的157个建议>(陆敏技 ...

  2. 【进阶修炼】——改善C#程序质量(10)

    158,不要写冗余注释. 注释应该写代码没有表达的东西. 代码能够自我描述就不要加注释. 159,废弃的注释应该尽早删除. 废弃的注释由于年代太久远,已经和现在的代码逻辑不匹配了,这样的注释只会误导人 ...

  3. 【进阶修炼】——改善C#程序质量(9)

    140,使用默认的访问修饰符. 如果不加访问修饰符,成员变量的默认是private的,类默认是internal的.为了明确访问的权限,我倒是建议都加上访问修饰符,这省不了多少代码. 141,不知道该不 ...

  4. 【进阶修炼】——改善C#程序质量(8)

    122,以<Company>.<Component>作为命名空间. 如Microsoft.Windows.Design.也可以用域名作为空间,如www.microsoft.co ...

  5. 【进阶修炼】——改善C#程序质量(7)

    113,声明变量时考虑最大值. Ushort的最大值是65535,用于不同的用途这个变量可能发生溢出,所以设计时应充分了解每个变量的最大值. 114,MD5不再安全. MD5多用于信息完整性的校验.R ...

  6. 【进阶修炼】——改善C#程序质量(6)

    90,不应为抽象类指定public的构造函数. 抽象类即使指定了public的构造函数,也是不能实例化的,编译通不过.抽象类的构造函数应该设定为protected,它的作用应该是初始化自己的成员,以及 ...

  7. 【进阶修炼】——改善C#程序质量(5)

    71, 区分异步和多线程的应用场景. 计算机的很多硬件,如硬盘,光驱,声卡,网卡都有DMA(Direct Memory Access)功能,它可以不占用cpu的资源,而异步的提出恰恰就是基于这个的.而 ...

  8. 【进阶修炼】——改善C#程序质量(4)

    46, 显示释放资源,需要实现IDisposable接口. 最好按照微软建议的Dispose模式实现.实现了IDisposable接口后,在Using代码块中,垃圾会得到自动清理. 47, 即使提供了 ...

  9. 【进阶修炼】——改善C#程序质量(3)

    32, 总是优先考虑泛型. 泛型代码有很好的重复利用性,和类型安全性. 33, 应尽量避免在泛型类中声明静态成员. 静态成员达不到共享的目的.List<int>和List<Strin ...

随机推荐

  1. debian 8 解压安装mysql(版本5.7.19)

    debian 8 解压安装mysql(版本5.7.19)一.下载 根据目标主机的型号官网下载mysql安装包如: mysql-server_5.7.19-1debian8_amd64.deb-bund ...

  2. wget for windows

    那么,来尝试下wget for windows 吧. 什么是wget? wget是一个强力方便的命令行下的下载工具,可以通过HTTP和FTP协议(两种最广泛的互联网协议)从因特网中检索并获取文件. 此 ...

  3. MySQL 主外键约束与标准SQL不同的地方

    [标准SQL的外键约束条件] 1): 子表引用父表的主键 drop table if exists child,parent; create table if not exists parent( i ...

  4. hackerrank-knapsack

    https://www.hackerrank.com/challenges/unbounded-knapsack 题目描述: #include <iostream> #include &l ...

  5. linux分享二:Linux如何修改字符集

    问题: 当在项目中用到服务器端导出并且查询条件中包含汉字时,总是导出失败,Excel中出现null字样,如何解决方法呢? 解决方法: 把linux的字符集改变一下. 路径:etc/sysconfig/ ...

  6. vue-client脚手架使用

    1.必须安装node环境 2.安装vue-client脚手架,在命令提示符中运行npm install -g vue-cli 3.创建项目 vue init 模板名 项目名 例如:vue init w ...

  7. 近观ArcGIS 10.3.1

    ArcGIS 10.3.1公布了是有很多增强和改变.接下来我们重点内容一睹为快. 一.三维内容制作.公布及分享 ArcGIS 10.3.1能够实现三维内容制作.公布及分享.公布流程: 须要的软件环境 ...

  8. 【转】10个非常有用的网页设计工具 | Goodfav Magazine

    10+ very useful Web Designer Tools Totally free legal computer eBooks download, available in various ...

  9. 【Unity】7.4 游戏外设输入

    分类:Unity.C#.VS2015 创建日期:2016-04-21 一.简介 Unity可以处理摇杆.游戏手柄.方向盘等标准游戏外设的输入,使用的方法如下图所示: 虚拟按键需要在输入管理器中配置,把 ...

  10. pc客户端网页录音和压缩

    web录音的功能,也就是怎么使用 getUserMedia 音频上传 栗子中最后返回的是Blob数据 return new Blob([dataview], { type: type }) 因为对ht ...