C#编码应注意的事项清单

这是从 [email protected] 上摘下来的一片文章,原文在那我已经记不清了,大概是最近十来天的文章吧,读了以后,感觉不错,不过其中有些地方,我读了以后,糊里糊涂的就过去了,自己也搞不清其中的含义,不过,我倒是把文章翻译出来了,现在这儿放着,以后有机会再该。内容如下:

我现在的客户端广泛的使用 PSP (注:程序段前缀),所以我回顾了用在我们项目中的 c# 代码,并归纳出一个清单。非常感激你能对此做出评论

1. 是否使用异常来显示错误而不是返回状态或错误代码?

2. 所有的类和公共方法是否使用 .NET 样式的注释?注意,

 1<summary> 注释应该论述公共方法是什么。对于怎么使用则应该放在  <remarks> 块中或是内嵌于正被讨论的代码中 
 2
 33\.  如果方法的参数不正确,是否使用一个异常来进行确认和拒绝? 
 4
 54\.  Debug.Asserts  是否被用来验证关于代码功能的假定?注释例如:  "j will be positive"  应该被作为断言(  Asserts  )重写 
 6
 75\.  那些不应该被初始化的类是否有一个私有的构造函数? 
 8
 96\.  那些被声明为值类型并极少使用为方法参数的类是否从方法中返回或是存放在集合(  Collections  )中? 
10
117\.  那些被只应用在一个程序集中的类是否被标记为  internal  ? 
12
138\.  那些能被多线程访问的单态类(  Singletons  )是否能够被正确地初始化?参考  the Enterprise  Solution Patterns book, p. 263. 
14
159\.  必须被继承类重载的方法是否被标记为  abstract  ? 
16
1710\.  不应该被重载的类是否标记为  sealed  ? 
18
1911\.  “as”  是否可能被不正确的使用? 
20
2112\.  是否类重载  ToString  而不是定义另外一个方法来输出对象的状态? 
22
2313\.  是否一个长的信息被发送到日志组件而不是控制台? 
24
2514\.  一个  finally  程序块是否紧随一个  try  构造以用作必须执行的代码? 
26
2715\.  相对于  for  (  int i…..  )构造  ,  是否更倾向于使用  foreach  ? 
28
2916\.  是否使用属性而不是实现  getter  和  setter  方法? 
30
3117\.  相对于没有赋值器的属性,是否更倾向于使用只读变量? 
32
3318\.  被继承类重载的所有方法是否使用了  override  关键字? 
34
3519\.  是否倾向于使用接口类而不是抽象类? 
36
3720\.  是否写代码基于接口而不是一个实现类? 
38
3921\.  那些资源消耗大的对象是否实现了  IDisposable  接口? 
40
4122\.  那些实现了  IDisposable  的对象是否在使用的时候才初始化? 
42
4323\.  相对于  Monitor Enter  构造,是否更倾向于使用  lock  关键字? 
44
4524\.  是否线程被事件或  Pulse  构造从等待状态激活,而不是调用  Sleep  ()等方式“积极”的等待? 
46
4725\.  如果重载  equals,  是否正确地实现了这一方法?重载  equals  的规则是复杂的,细节请参见  Richter p153-160 
48
4926\.  如果  ==  和!  =  被重载,由此他们重定向到了  Equals  ? 
50
5127\.  是否提供了  Equals  的那些对象也提供了  GetHashCode  的重载版本?  GetHashCode  提供了和  Equals  相同的语义。注意:  GetHashCode  的重载应该利用对象的成员变量并且必须返回一个不再更改的哈希码。 
52
5328\.  是否所有的异常类有一个构造函数带有一个字符参数,另外一个构造函数带有一个字符参数和一个异常参数? 
54
5529\.  是否所有的异常类继承与基本的  Matrix  异常并正确地适合异常的层次? 
56
5730\.  是否那些将要被封送或远程调用的类使用了  Serializable  属性? 
58
5931\.  是否那些使用了  Serializable  属性的类,包括  Exception  和  EventArgsl  类型的类,有一个默认的构造函数? 
60
6132\.  那些实现了  ISerializable  的类是否即提供了必须的  GetObjectData  重载也提供了带有一个  SerializeInfo  和一个  StreamingContext  参数的构造函数? 
62
6333\.  在作浮点值运算的时候,是否所有的常量加倍而不是整数? 
64
6534\.  是否所有的代理有一个  void  返回类型并且避免使用  out  或  ref  参数? 
66
6735\.  是否继承于  EventArgs  的类中的所有成员都是只读?这将阻止一个预订者更改这个  EventArgs  以免影响另一个预订者。 
68
6936\.  代理是否被发布为事件?这将阻止预订者引发事件。详细请参见  Lowy, p. 102 
70
7137\.  通常的安装和卸载  nUnit  代码是否孤立于那些标记了合适属性的安装和卸载方法? 
72
7338\.  消极的单元测试是否使用  ExpectedExceptin  属性去显示一定会抛出某一个异常 
74
75参考: 
76
77Juval Lowy, "Programming .NET Components" 
78
79Jeffrey Richter, "Applied Microsoft .NET Framework Programming" 
80
81"Enterprise Solution Patterns using Microsoft .NET" - available in published form or as a free pdf</remarks></summary>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus