2排版注释
1. 采用如下顺序组织类中的代码:
类说明(注释)
using语句组
名称空间声明
类声明
类说明(注释)
using语句组
名称空间声明
类声明
.NEt标准控件。
USER CONTROL或CUSTOM CONTROL
私有变量
私有变量
公有变量
方法声明
2. 尽量使用using语句来避免使用类的全路径名称。
3. using语句组中首先是框架的命名空间,其次是第三方的,最后是自定义的。
4. 每行缩进4个空格,不要使用tab键进行缩进。(这个有不同的意见)
5. 一般注释开始使用//双斜线,不要使用*注释,注释和代码使用同样的缩进。
6. 不要注释显而易见的代码,好的代码应该是自解释的。好的变量/函数名可减少注释。
7. 注释要简洁明了,注意不要因为错别字导致歧义。
8. 修改代码时,总是使代码周围的注释保持最新。
9. 注释放在被注释语句的上面,并与其上的代码用空行分隔。
10. 在每个文件头必须包含以下注释说明
/*----------------------------------------------------------------
Copyright (C) 2007 石化盈科信息技术有限公司版权所有。
文件名:
文件功能描述:
创建人:
创建时间
----------------------------------------------------------------*/
11. 每个类前有如下注释说明(一个文件包含一个类的时候,可选)
/*----------------------------------------------------------------
类名:
类功能描述:
创建人:可选
创建时间:可选
----------------------------------------------------------------*/
12. 每个函数必须有如下注释说明 (可以参考C# 的自己的格式,但应包含下列内容)
/*---------------------------------------------------------------
///函数名:
///功能描述:
///参数列表说明:
///调用的主要函数列表:
///创建人:可选
///创建时间:可选
///修改人:
///修改时间:
///修改内容描述:
-------------------------------------------------------------------*/
13. 每行只定义一个变量,变量的注释放在变量定义的右边。
14. 一行代码不应超过80个字符。
15. 全局变量必须要有注释。
16. 所有的成员变量在类的开始进行定义,并用空行于其他的方法分开。
17. 局部变量的定义尽量靠近使用的地方。
18. 左花括号总是位于新行的开始,而不是位于类名或函数名后。
19. 一元运算符与运算数之间可不用间隔,二元运算符前后用空格隔开。
20. 如:
int a;
int b;
int c;
a = 9;
a++;
b = 9;
c = a + b;
for (a = 0; a < c; a++)
{
b++;
}
21. if,for,whil等语句的执行体部分一定要用花括号括起来,即时只有一语句。
22. 匿名方法的代码排版和普通函数体保持统一风格,作花括号在新行和delegate的声明左对齐。
23. 使用#Region将代码组织在一起. 以便管理源代码。
24. 避免在函数中使用#if # else 来包含代码,应适用 condition 方法。
public class MyClass
{
[Conditional(“MySpecialCondition”)]
public void MyMethod()
{
}
}
3编码惯例
1. 避免在一个文件中定义多个类。
2. 一个文件中只定义一个命名空间。
3. 一个函数不要超过200行。
4. 函数的参数如果超过5个,建议使用结构进行封装。
5. 不要随意改动机器生成的代码。尽可能使用局部类将需要维护的代码分离出来。
6. 使用常量代替对数值的硬编码。
7. 对于只读变量使用readonly 指示符。
8. 一个程序集中避免出现多个Main函数。
9. 仅对最需要的类型标记为public,其他的标记为internal。
10. 避免使用friend程序集,这样增加了程序集的耦合度。
11. 代码避免依赖于从某个特定位运行的程序集。
12. 应用程序集(.exe)中代码越少越好,业务逻辑尽量封装到类库中。
13. 不要自定义枚举的内部数据表示类型,避免给枚举类型显示赋值,除非是2的幂。
14. 避免使用?:操作符。
15. 避免在条件判断表达式中使用返回bool的函数。应该将其赋给变量,然后再进行判断。
16. 尽量使用从0计数的数组。
17. 使用属性,避免使用public/protect变量。
18. 使用 for语句显示初始化数组。
19. 避免使用new继承修饰符,而是使用override。
20. 对非密封类总是将public和protected方法标记为virtual。
21. 除非为了互操作,否则不要使用不安全的代码。
22. 不要显示类型转换,应适用as操作符进行类型定义转换。
23. 对于有索引的集合使用基于0的索引。
24. 使用EventHandler<T>代替自己定义的事件处理委托。
25. 使用EventHelper发布事件,而不要显示的抛出事件。
26. 避免显示声明委托的实例,应如下定义委托:
delegate void SomeDelegate();
void SomeMethod()
{
}
SomeDelegage someDelegate = SomeMethod;
27. 不要使用只有一个方法的接口,接口中方法的数目不要超过20个。
28. 不要把事件作为接口的成员。
29. 优先使用接口,其次考虑使用抽象类。
30. 优先使用明确的接口实现。
31. 未经明确声明不要使用一个对象具有的接口。
MyObject myObject;
IMyInterface myInterface;
myInterface = myObject as IMyInterface;
32. 使用资源代替把呈现给用户的字符串进行硬编码。
33. 不要把与部署有关的字符串进行硬编码。
34. 使用String.Empty 给空字符串赋值。
35. 创建一个长字符串时,使用StringBuilder代替string。
36. 不要再结构体中提供函数。
37. 当使用静态成员变量是提供静态构造函数。
38. 能使用前绑定就不要使用后绑定。
39. 给switch语句提供default子句,进行异常判断。
40. 除非在一个构造函数中调用另一个构造函数,否则尽量不要使用this引用。(不明白)。
41. 除非名称冲突或者需要调用父类的构造函数,否则不要使用base引用。(不明白)
42. 不要使用GC.AddMemeryPresure
43. 不要依赖HandleCollector
44. 出于性能的考虑,除了溢出检测,不要使用check关键字。
<以下提到了限制的概念还不明白 >
45. 使用泛型的代码中避免与System.Object进行类型转换,而是使用限制或as算符。
//避免
class MyClass
{
void SomeMethod(T t)
{
object temp = t;
SomeClass obj = (SomeClass)temp;
}
}
//正确
//正确
class MyClass where T : SomeClass
{
void SomeMethod(T t)
{
SomeClass obj = t;
SomeClass obj = t;
}
}
46. 泛型接口不要定义限制。接口层的限制通常能用强类型代替。
47. 不要再接口中定义与方法相关的限制。
48. 不要再委托中定义限制。
49. 如果类或方法定义了泛型和非泛型两种方式,优先使用泛型。
当实现一个继承自非泛型的接口的接口时,要显示声明所有方法,并把非泛型方法委托给泛型方