这是一个大纲形式的概要,以便自己可以花较少的时间反复阅读.在开发中,多加注意这些有用的建议,让自己成为一个更优秀的程序员.内容主要来自<编写高质量代码-改善C#程序的157个建议>(陆敏技),这本书写的真的很好,都是些实战经验的总结,建议大家购买,这其中的建议不仅仅适合于C#,只要你做.NET开发,阅读此书都会从中受益.同时,其他书籍和资料的一些好的编程建议,我也会不断更新到这里. 1, 字符串使用. 应避免发生装箱:避免分配额外的内存:考虑使用StringBuilder来替代string.s…
158,不要写冗余注释. 注释应该写代码没有表达的东西. 代码能够自我描述就不要加注释. 159,废弃的注释应该尽早删除. 废弃的注释由于年代太久远,已经和现在的代码逻辑不匹配了,这样的注释只会误导人,应该删除. 160,注释掉的代码. 这是一个灾难,没有人知道它还有没有用,一直被遗留下来,然后代码不断的腐朽下去,勇敢的删除它吧,版本管理工具会记得它. 160,死函数. 死函数,即没有被调用的函数,应该删除,版本管理工具会记得它. 162,死代码. 可以在条件语句如if,switch中找到,也可…
140,使用默认的访问修饰符. 如果不加访问修饰符,成员变量的默认是private的,类默认是internal的.为了明确访问的权限,我倒是建议都加上访问修饰符,这省不了多少代码. 141,不知道该不该加大括号的时候就加上. 大括号会多占用两行代码,到底一行语句的代码需不需要加大括号这是一个争论.但是为了避免引入不必要的bug还是加上吧. 142,总是提供有意义的命名. 我们不希望看到如iTemp的命名,类似于i的命名只应该出现在循环中.变量的命名应尽可能表达它应该表达的意思,不要太随意的命名,…
122,以<Company>.<Component>作为命名空间. 如Microsoft.Windows.Design.也可以用域名作为空间,如www.microsoft.com,就可以写成com.microsoft. <Component>,这种命名方法在java中比较常见.但.net中似乎不是很推荐,最好用第一种.好的命名空间可以避免不同程序集间类名的冲突. 123,程序集不必与命名空间同名. 程序集名称表示的是物理分组,而命名空间是逻辑分组,两者没有必然的联系.但…
113,声明变量时考虑最大值. Ushort的最大值是65535,用于不同的用途这个变量可能发生溢出,所以设计时应充分了解每个变量的最大值. 114,MD5不再安全. MD5多用于信息完整性的校验.R=H(S),MD5的算法是不可逆的,也就是我们几乎没有可能根据生产的MD5码去还原原文.但是我们可以使用穷举的办法生成MD5码来对比,由于我们平常设定的密码都比较简单,如:123456,根本不用很长的时间就会被破解掉.为了有效防止破解,一个可行的做法是为我们的密码固定加一个字符串"%¥#--@!&a…
90,不应为抽象类指定public的构造函数. 抽象类即使指定了public的构造函数,也是不能实例化的,编译通不过.抽象类的构造函数应该设定为protected,它的作用应该是初始化自己的成员,以及可以被子类构造函数调用.设定为public权限毫无意义. 91,可见字段应该重构为属性. 属性比字段有更好的灵活性,可以加入代码控制,可以在类型内部实现线程安全访问,可以让类型得到通知(如WPF系统),这些都是字段所不具备的.当然,如果仅限于类型内部使用,应该用字段. 92,谨慎将数组或集合作为属性…
71, 区分异步和多线程的应用场景. 计算机的很多硬件,如硬盘,光驱,声卡,网卡都有DMA(Direct Memory Access)功能,它可以不占用cpu的资源,而异步的提出恰恰就是基于这个的.而多线程是操作系统上的并行执行的代码,是会占用cpu资源的.所以关于这两种的使用场景建议是:1)对于I/0密集型操作使用异步.2)对于计算密集型操作使用多线程. 72, 在线程同步中使用信号量. 值类型是不能被锁定的,引用类型上的等待机制,分为锁定和信号同步.锁定通过lock关键字或Monitor来完…
46, 显示释放资源,需要实现IDisposable接口. 最好按照微软建议的Dispose模式实现.实现了IDisposable接口后,在Using代码块中,垃圾会得到自动清理. 47, 即使提供了显示的释放方法,也应该在终结器中提供隐式实现. 因为我们不能保证用户会主动去调用这个释放方法,但我们要保证在垃圾回收时,这些资源能得到清理. 48, Dispose方法应该允许被多次调用. 我们可以创建一个变量disposed来标明对象是否被释放了. 49, 在Dispose模式中应提供一个受保护的…
32, 总是优先考虑泛型. 泛型代码有很好的重复利用性,和类型安全性. 33, 应尽量避免在泛型类中声明静态成员. 静态成员达不到共享的目的.List<int>和List<String>是两个不同的类型,而静态成员是针对类型的.当然2个List<int>之间是可以共享静态成员的,但为了不必要的混淆,应该避免使用静态成员. 34, 为泛型参数添加约束. 没有约束的参数,功能是有限的,添加了约束后,我们就可以使用约束类型的方法和属性了,程序更加灵活. 35, 使用Defau…
16, 元素可变的情况下应避免用数组. 数组是定长的集合,可以考虑用ArrayList或List<T>集合.ArrayList元素是object类型,有装箱的开销,性能较低.另外Array类提供了Array.CreateInstance来创建数组,Array.Copy来拷贝数组,但这牵涉到新数组的创建,会增加开销. 17, 多数情况下用foreach代替for循环. 18, Foreach不能代替for. Foreach不能对元素进行增删操作,不能访问序号. 19, 使用对象初始化器和集合初始…