您的位置:首页 > 编程语言 > C#

基于.NET下的代码开发规范(C#版本)

2007-03-27 09:19 274 查看
{DotNet(.Net)项目小组}

代码开发规范(C#版本)

文件状态:
[] 草稿
[√ ] 正式发布
[ ] 正在修改 文件标识: Project
当前版本: V1.0
作 者: 吴华军
完成日期: 2006年01月05日

版 本 历 史

版本/状态 作者 参与者 起止日期 备注
V1.0 吴华军 2005年01月05日 完成了项目小组代码编写规范的草稿

目录
1 文档说明 4
1.1 文档目的 4
1.2 范围 4
1.3 术语说明 4
1.4 参考资料 4
2 编程要求 4
2.1 程序结构要求 4
2.2 可读性要求 4
2.3 结构化要求 5
2.4 正确性与容错性要求 5
2.5 可重用性要求 5
3 C#编程规范 5
3.1 代码格式 5
3.2 注释(Comment)规范 6
3.2.1 文件注释规范 6
3.2.2 模块(类)注释规范 7
3.2.3 类属性注释规范 7
3.2.4 方法注释规范 7
3.2.5 代码间注释规范 8
3.3 变量(Variable)命名规范 8
3.3.1 程序文件(*.cs)中的变量命名规则 8
3.3.2 控件命名规则 10
3.4 常量命名规范 10
3.5 类(Class)命名规范 11
3.6 接口(Interface)命名规范 11
3.7 方法(Method)命名规范 11
3.8 命名空间(NameSpace)命名规范 11
3.9 文件命名规范 12

1 文档说明
1.1 文档目的
由于业务管理系统是一个大型产品,其开发由很多的人协同作战,如果不统一编程规范,最终合到一起的程序,其可读性将较差,这不仅给代码的理解带来障碍,增加维护阶段的工作量,同时不规范的代码,隐含错误的可能性也比较大。
为了保证编写出的程序都符合相同的规范,保证一致性、统一性而建立此程序编码规范。
以黄色背景的文字,必须严格执行。其他可以仅供参考。
1.2 范围
适用于软件开发部,所有基于.NET(C#/VB语言版本)平台开发软件的工作者,其余平台、语言仅供参考。
1.3 术语说明
1.4 参考资料
2 编程要求
2.1 程序结构要求
1、程序结构清晰,简单易懂,单个函数的程序行数(除去注释)不得超过100行。应避免太多的分支结构及太过于技巧性的程序,尽量不采用递归模式。
2、打算干什么,要简单,直接了当,代码精简,避免垃圾程序。
3、尽量使用.NET库函数和公共函数(无特殊情况不要使用外部方法调用windows的核心动态链接库)。
4、不要随意定义全局变量,尽量使用局部变量。
2.2 可读性要求
1、 可读性第一,效率第二
2、 保持注释与代码完全一致。不允许修改了代码,却不修改注释。
3、 每个源程序文件,都有文件头说明,说明规格见规范。
4、 每个函数,都必须有函数头说明,说明规格见规范。
5、 主要变量定义或引用时,注释能反映其含义。
6、 处理过程的每个阶段都有相关注释说明。
7、 在典型算法前都有注释, 同时算法在满足要求的情况下尽可能简单。
8、 注释可以与语句在同一行,也可以在上行。
9、 空行和空白字符也是一种特殊注释。
10、 一目了然的语句不加注释。
11、 注释的作用范围可以为:定义、引用、条件分支以及一段代码。
12、 注释行数(不包括程序头和函数头说明部份)应占总行数的 1/5 到 1/3
13、 常量定义有相应说明。
14、 利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位,定义Tab为 4个空格,使用VS.NET的默认设置字节。
15、 循环、分支层次禁止超过五层。

2.3 结构化要求
1、 禁止出现两条等价的支路。
2、 禁止GOTO语句。
3、 用 IF 语句来强调只执行两组语句中的一组。
4、 用 CASE 实现多路分支。
5、 避免从循环引出多个出口。
6、 函数只有一个出口。
7、 不使用条件赋值语句。
8、 避免不必要的分支。
9、 不要轻易用条件分支去替换逻辑表达式。

2.4 正确性与容错性要求
1、 程序首先是正确,其次是优美
2、 无法证明所编程序没有错误,因此在编写完一段程序后,应先回头检查。
3、 改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。
4、 所有变量在调用前必须被初始化。
5、 对所有的用户输入,必须进行合法性检查。
6、 不要比较浮点数的相等,如: 10.0 * 0.1 == 1.0 ,不可靠
7、 程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否逻辑锁定、打印机是否联机等,对于明确的错误,要有明确的容错代码提示用户。
8、 单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。编写程序时,必须想好测试的方法,换句话说,”单元测试” 的测试方案应在程序编写时一并拟好。
9、 尽量使用规范的容错语句.
10、 版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要
在文件及函数的修改记录中加以记录。
2.5 可重用性要求
1、重复使用的完成相对独立功能的算法或代码应抽象为asp.net服务或类。
2、asp.net服务或类应使用OO思想,尽量减少外界联系,考虑独立性或封装性。

3 C#编程规范
3.1 代码格式
1、 所有的缩进为4个空格,使用VS.NET的默认设置。

2 、在代码中垂直对齐左括号和右括号。
if(x==0)
{
Response.Write("用户编号必须输入!");
}
不允许以下情况:
if(x==0) {
Response.Write("用户编号必须输入!");
}
或者:
if(x==0){ Response.Write("用户编号必须输入!");}

3、为了防止在阅读代码时不得不滚动源代码编辑器,每行代码或注释在1024*768的显示频率下不得超过一显示屏
4、当一行被分为几行时,通过将串联运算符放在每一行的末尾而不是开头,清楚地表示没有后面的行是不完整的。
5、每一行上放置的语句避免超过一条。
6、在大多数运算符之前和之后使用空格,这样做时不会改变代码的意图却可以使代码容易阅读。
例:
int j = i + k;
而不应写为
int j=i+k;
7、将大的复杂代码节分为较小的、易于理解的模块。
8、编写 SQL 语句时,对于关键字使用全部大写,对于数据库元素(如表、列和视图)使用大小写混合。
9、将每个主要的 SQL 子句必须放在不同的行上,这样更容易阅读和编辑语句,例如: SELECT FirstName, LastName
FROM Customers
WHERE State = 'WA'
3.2 注释(Comment)规范
注释规范包括:模块(类)注释规范、类的属性、方法注释规范、代码间注释
3.2.1 文件注释规范
在文件开始的注释内容包括:公司名称、版权、作者名称、时间、模块用途、背景介绍等,复杂的算法需要加上流程说明。
文件开头的注释模板
///
///
/// File Name::
/// Copyright (c) 2003-2008
/// Group:
/// Create Person:
/// Date Created:
/// Remark:
/// Edition Number:1.1.1.1
///
/// Edition Number: Date Modified: Modify Person:
/// Modify Reason:
///<每次修改均增加上三行,版本连续增加>
///--------------------------------------------------------------------------
///
3.2.2 模块(类)注释规范
模块开始必须以以下形式书写模块注释:
///
///模块编号:<模块编号,可以引用系统设计中的模块编号>
///作用:<对此类的描述,可以引用系统设计中的描述>
///作者:作者中文名
///编写日期:<模块创建日期,格式:YYYY-MM-DD>
///
如果模块有修改,则每次修改必须添加以下注释:
///
///Log编号:<LOG< SPAN>编号,从1开始一次增加>
///修改描述:<对此修改的描述>
///作者:修改者中文名
///修改日期:<模块修改日期,格式:YYYY-MM-DD>
///

3.2.3 类属性注释规范
在类的属性必须以以下格式编写属性注释:
///
///属性说明
///
3.2.4 方法注释规范
在类的方法声明前必须以以下格式编写注释
///
/// 说明:<对该方法的说明>
///
/// <参数说明>
///
///<对方法返回值的说明,该说明必须明确说明返回的值代表什么含义>
///
采用以下示例格式
/// <summary>
/// 摘要
/// </summary>
/// <param name="参数名称">参数说明</param>
/// <param name="参数名称">参数说明</param>
/// <param name="参数名称">参数说明</param>
/// <returns>返回值说明</returns>

3.2.5 代码间注释规范
代码间注释分为单行注释和多行注释:
单行注释:
//<单行注释>
多行注释:
/*多行注释1
多行注释2
多行注释3*/
代码中遇到语句块时必须添加注释(if,for,foreach,……),添加的注释必须能够说明此语句块的作用和实现手段(所用算法等等)。

3.3 变量(Variable)命名规范
3.3.1 程序文件(*.cs)中的变量命名规则

程序中变量名称 = 变量的前缀 +代表变量含意的英文单词或单词缩写。

1、 类模块级的变量用“m_”作前缀
public class hello
{
private string m_Name;
private DateTime m_Date;
}
2、 类的属性所对应的变量,采用属性名前加“m_”前缀的形式
public class hello
{
private string m_Name;
public string Name
{
get
{
return m_Name;
}
}
}
3、 过程级的变量不使用前缀
public class hello
{
void say()
{
string SayWord;
}
}
4、 过程的参数使用“p_”作为参数
public class hello
{
void say(string p_SayWord)
{
}
}

5、 异常捕获过程中的Exception变量命名
针对异常捕获过程中的Exception变量命名,在没有冲突的情况下,统一命名为e;
如果有冲突的情况下,可以重复e,比如:ee。
Try
{
// code
try
{
//code
}
catch(Exception ee)
{
// code
}
}
catch(Exception e)
{
// code
}
补充:如果捕获异常不需要作任何处理,则不需要定义Exception实例
例:
try
{
//code
}
catch( Exception )
{
}

6、 鉴于大多数名称都是通过连接若干单词构造的,使用大小写混合的格式以简化它们的阅读。每个单词的第一个字母都是大写.
7、 即使对于可能仅出现在几个代码行中的生存期很短的变量,仍然使用有意义的名称。仅对于短循环索引使用单字母变量名,如 i 或 j。
8、 在变量名中使用互补对,如 min/max、begin/end 和 open/close。
9、 不要使用原义数字或原义字符串,如 For i = 1 To 7。而是使用命名常数,如 For i = 1 To NUM_DAYS_IN_WEEK 以便于维护和理解。
3.3.2 控件命名规则

控件命名=Web控件缩写前缀 + “_” +变量名

控件 缩写
Label lbl
TextBox txt
CheckBox chk
Button btn
ListBox lst
DropDownList drp
DataGrid dgd
等等

3.4 常量命名规范
常量名也应当有一定的意义,格式为 NOUN 或 NOUN_VERB。常量名均为大写,字之间用下划线分隔。
例:
private const bool WEB_ENABLEPAGECACHE_DEFAULT = true;
private const int WEB_PAGECACHEEXPIRESINSECONDS_DEFAULT = 3600;
private const bool WEB_ENABLESSL_DEFAULT = false;

注:
变量名和常量名最多可以包含 255 个字符,但是,超过 25 到 30 个字符的名称比较笨拙。此外,要想取一个有实际意义的名称,清楚地表达变量或常量的用途,25 或 30 个字符应当足够了。

3.5 类(Class)命名规范
1. 名字应该能够标识事物的特性。
2. 名字尽量不使用缩写,除非它是众所周知的。
3. 名字可以有两个或三个单词组成,但通常不应多于三个。
4. 在名字中,所有单词第一个字母大写。
例如 IsSuperUser,包含ID的,ID全部大写,如CustomerID。
5. 使用名词或名词短语命名类。
6. 少用缩写。
7. 不要使用下划线字符 (_)。
例:
public class FileStream
public class Button
public class String

3.6 接口(Interface)命名规范
和类命名规范相同,唯一区别是 接口在名字前加上“I”前缀
例:
interface IDBCommand;
interface IButton;

3.7 方法(Method)命名规范
和类命名规范相同。
3.8 命名空间(NameSpace)命名规范
和类命名规范相同。
3.9 文件命名规范
和类命名规范相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐