当前位置:文档之家› 软件项目-.NET编码规范-模板

软件项目-.NET编码规范-模板

.NET编码规范.NET编码规范版本:V1.0.NET编码规范目录1介绍 (1)1.1目的 (1)1.2范围 (1)1.3参考文档 (1)2规范概述 (1)3规范详述 (1)3.1文件组织 (1)3.1.1源文件 (1)3.1.2目录安排 (2)3.2缩进 (2)3.2.1分行 (2)3.2.2空白 (2)3.3注释 (3)3.3.1块注释 (3)3.3.2单行注释 (3)3.3.3文档注释 (3)3.4变量声明 (4)3.4.1每行声明的数量 (4)3.4.2初始化 (4)3.5类和接口的声明 (4)3.6命名约定 (5)3.6.1大写风格 (5)3.6.2命名规则 (6)3.6.3class,struct和namespace命名规则 (6)3.6.4interface命名规则 (6)3.6.5enum命名规则 (6)3.6.6域命名规则 (7)3.6.7参数命名规则 (7)3.6.8变量命名规则 (7).NET编码规范3.6.9方法命名规则 (7)3.6.10属性命名规则 (7)3.6.11事件命名规则 (8)3.7代码细节规范 (8)1 介绍1.1 目的本文件的目的是描述用.NET编写代码过程中应遵循的规范,以确保编写出强壮可靠、符合规范的应用程序。

虽然这里的代码示例是用C#编写的,但如果使用另外一种编程语言,其中的大多数规则和原理也是适用的。

对于.net开发人员,应力求遵守此文档中的规范,代码审查时,此文档将作为重要的参考依据。

1.2 范围本文件适用于用.NET来实现的软件产品在编码实现过程中应遵循的规范。

1.3 参考文档[说明本文件的参考文档。

]2 规范概述本规范为实现过程中用.NET来进行编码时应遵循的规范,主要内容包括:文件组织、缩进、注释、变量声明、类和接口的声明、命名约定及代码细节规范。

在实现过程中的编码实现,代码走查活动中使用到此规范。

3 规范详述3.1 文件组织3.1.1 源文件把每个类都放在单独的文件中,文件名字和类名一致(用.CS作为扩展名)。

严禁将多个命名空间/类放在同一个源文件中(自动生成的除外)。

3.1.2 目录安排为每个命名空间创建一个目录(如,对于MyProject.TestSuite.TestTier使用MyProject/TestSuite/TestTier作为路径,不要使用带“.”的命名空间)。

这样更易于映射命名空间到目录。

3.2 缩进3.2.1 分行如果表达式不适合单行显示,应根据下面通常的原则分行:●一个逗号后换行●在一个操作符后换行●在表达式的高层次处换行●新行与前一行在同一层次,并与表达式的起始对齐方法分行的例子:long MethodCall(expr1, expr2,expr3, expr4, expr5);算术表达式分行的例子:好的:var = a * b / (c – g + f) +4 * z;坏的风格,要避免:var = a * b / (c – g +f) + 4 * z;第一个是好的,因为分行符合高层次规则。

3.2.2 空白不要使用空格缩进,要是用Tabs,这个也是默认的缩进符。

3.3 注释3.3.1 块注释通常要避免块注释,而使用C#标准的///注释来描述。

如果希望使用块注释,应该使用下面的风格:/ * Line 1* Line 2* Line 3*/块注释很少使用,通常是用来注释掉大块的代码。

3.3.2 单行注释应该使用//注释掉一行代码,也可以用它注释掉代码块。

当单行注释用来做代码解释时,必须要缩进到与代码对齐。

3.3.3 文档注释单行XML注释的形式如下:/// <summary>/// 此类型/字段注释/// </summary>多行XML注释的形式如下:/// <exception cref=”BogusException”>/// This exception gets thrown as soon as a/// Bogus flag gets set./// </exception>3.4 变量声明3.4.1 每行声明的数量每行只有一个声明,以方便注释,如:int level; // indentation levelint size; // size of table变量的命名意义要明确。

如果能够自解释,如indentLevel,就不用注释。

不好的:int a, b; // a和b代表的意思不明确,即便注释,在其他地方也不知道具体含义3.4.2 初始化尽量在局部变量声明时进行初始化,例如:string name = ;或int val = time.Hours;注意:初始化数据链接等相关对象时,可以考虑使用Using语句,以方便CLR对其进行回收,如:Using (SqlConnection conn = new SqlConnection()){……}3.5 类和接口的声明当写C#类和接口时,应按照下面的格式规则:在方法名字和参数列表的起始括号“(”之间没有空格开括号“{”应出现在声明语句之后的下一行闭括号“}”自己占一行,并缩进到对应的开括号位置例如:class MySample : MyClass, IMyInterface.NET编码规范{int myInt;public MySample(int myInt){this.myInt = myInt;}void Inc(){++myInt;}void EmptyMethod(){}}3.6 命名约定3.6.1 大写风格C#代码中的标志符符命名主要有以下3中风格:Pascal风格:大写每一个单词的第一个字符,如TestCounter。

Camel风格:除了第一个单词,大写其它单词的第一个字符,如testCounter全部大写:如果一个标志符是只包含1,2或3个字符的缩写,可以全部大写,例如:public class Math{public const double PI = ......}在.Net中,通常认为使用下划线和匈牙利符号命名是不好的。

匈牙利符号定义了一组名字的前缀和后缀,来表示变量的类型。

这种命名风格在早期的windows编程中广泛使用。

在MFC编程中,还习惯使用m_作为成员变量的前缀。

这些风格在.Net中不应该使用。

记住:一个好的变量名字应该描述语义,而不是类型。

但GUI代码是个例外。

所有GUI元素类型(如Button)的域和变量名字,应该以它的类型全名作为后缀,例如:System.Windows.Forms.Button cancelButton;//或者btnCancelSystem.Windows.Forms.TextBox nameTextBox;//txtName注意GUI变量首单词的首字幕是小写的。

3.6.3 class,struct和namespace命名规则●名字必须是名词或名词短语●异常类要以Exception作为后缀●不要使用任何前缀●使用Pascal风格3.6.4 interface命名规则●用名词,名词短语或者描述行为的形容词命名接口。

(如IComponent,IEnumbetable)●使用Pascal风格●使用I作为名字的前缀,I后面的字符(接口名字的第一个字符)要大写3.6.5 enum命名规则●枚举类型名和值的名字都使用Pascal风格●枚举类型和值都没有前缀和后缀●使用描述性的名字,能充分表示出变量的含义●对于静态的readonly和const域,用名词,名词短语或名词缩写命名●public域使用Pascal风格●protected和private域使用Camel风格●要注意的是:CONST常量中的名词短语全部大写,且用下划线分割,例如●public const int MAX_COUNT;3.6.7 参数命名规则●使用描述性的名字,能充分表示出变量的含义●使用Camel风格3.6.8 变量命名规则●尽量使用含义明确的名字●如果变量仅用来在循环中计数,应优先使用i,j,k,l,m,n●使用Camel风格3.6.9 方法命名规则●用动词或动词短语命名●使用Pascal风格3.6.10 属性命名规则●使用名词或名词短语命名●使用Pascal风格3.6.11 事件命名规则●事件控制器要带有EventHandler后缀.NET编码规范●使用sender和e命名两个参数●事件参数类要带有EventArgs后缀●考虑使用动词命名事件●对于有“之前”或“之后”概念的事件,要使用现在时或过去时命名●使用Pascal风格3.7 代码细节规范1.原则上,尽量不要手工的修改机器产生的代码。

2.避免利用注释解释显而易见的代码。

代码应该可以自解释。

好的代码本身就应具体良好的可读性,所使用的变量和方法命名一般情况下不需要注释。

3.在捕获(catch)语句的抛出异常(如果需要的话)子句中(throw),总是抛出原始异常,用以维护原始错误的堆栈分配。

4.避免方法的返回值是错误代码。

5.避免在条件语句中调用返回bool值的函数。

可以使用局部变量并检查这些局部变量。

这可防止诸如在循环调用时产生的性能损失。

6.不要提供public 和protected的成员变量,使用属性代替他们。

7.避免在继承中使用new而使用override来进行替换。

8.除非使用interop(COM+ 或其他的dll)代码否则不要使用不安全的代码(unsafe code)。

9.避免显式的转换,使用as操作符进行兼容类型的转换。

10.在调用委托之前一定要检查它是否为null。

11.不要直接编写可能会更改的基于配置的字符串,比如连接字符串。

12.当需要构建较长的字符串的时候,例如循环的对字符串进行连接操作,应该考虑使用StringBuilder不要使用string来处理。

13.原则上不应使用goto语句,除非在能够大大减轻编码的复杂性,并不影响可读性的前提下才允许使用。

14.在switch语句中总是要有default子句。

15.总是选择使用C#内置(一般的generics)的数据结构。

16.初始化类的实例时,除非十分必要,否则不要赋null值。

8 / 8。

相关主题