资源描述
C#开发规范
易泓管理咨询开发参考文档
文档准备人: 张炜
制作日期: 2010年01月08日
提交日期: 2010年01月08日
版本号: V1.0
状态:
易泓管理咨询
浙江省杭州市滨江区江陵路1760号
邮编:310051
®易泓公司 & Geely 版权所有
本文档特为上海易泓企业管理咨询有限公司软件开发制作
Creating Customer Values
为客户创造价值
文档描述
文件名
状态
C#开发规范
未评审
变更记录
日期
作者
版本
描述
2010-01-08
张炜
V1.0
审阅
审阅者
审阅时间
注释
目录
1. 简介 5
1.1. 目的 5
1.2. 范围 5
1.3. 引用、参考 5
2. 代码组织与风格 5
2.1. TAB 5
2.2. 空行 5
2.3. 代码块长度 6
2.4. “{”,“}” 6
2.5. 行宽 6
2.6. 空格 6
3. 注释 6
3.1. 注释的基本约定 6
3.1.1 注释的基本约定 6
3.1.2 注释应该增加代码的清晰度 6
3.1.3 保持注释的简洁,不是任何代码都需要注释的,过多的注释反而会影响代码的可读性 6
3.1.4 注释不应该包括其他的特殊字符 6
3.1.5 先写注释,后写代码 6
3.2. 注释类型 7
3.2.1 块注释 7
3.2.2 行注释 7
3.2.3 尾随注释 7
3.2.4 行尾注释 7
3.2.5 文档注释 7
3.3. 注释那些部分 7
4. 命名 9
4.1. 命名的基本约定 9
4.2. 标示符的命名约定 9
5. 声明 10
6. 表达式和语句 11
7. 错误处理和异常事件 12
8. 可移植性 12
1. 简介
1.1. 目的
本规范为一套编写高效可靠的C# 代码的标准、约定和指南。它以安全可靠的软件工程原则为基础,使代码易于理解、维护和增强,提高生产效率。同时,将带来更大的一致性,使软件开发团队的效率明显提高。
1.2. 范围
本规范应用于采用C#规范的项目中,所有项目中的C#代码(含ASPX)均应遵守这个规范。同时,也可作为其它项目的参考。
1.3. 引用、参考
参考了《JAVA开发规范》
2. 代码组织与风格
2.1. TAB
一个Tab为4个空格长。
2.2. 空行
适当的增加空行,来增加代码的可读性。
在下列情况下应该有两行空行:
l 同一文件的不同部分之间;
l 在类,接口以及彼此之间;
在下列情况之间应该有一行空行:
l 方法之间;
l 局部变量和它后边的语句之间;
l 方法内的功能逻辑部分之间;
2.3. 代码块长度
每个代码块尽量控制在1个屏幕之内,方便浏览。
2.4. “{”,“}”
开括号“{”放在块的所有者所在行的最后面,闭括号“}”单独放在代码块的最后一行。
2.5. 行宽
每行代码和注释不应超过70个字节或屏幕的宽度,如超过则应换行,换行后的代码应该缩进8个字符。
2.6. 空格
括号和它里面的字符之间不应该出现空格。括号应该和它前边的关键词留有空格,如:while (true) {};
但是方法名和左括号之间不应该有空格。
参数之间的逗号后应该加一空格。如:method1(int i1, int i2)
for语句里的表达式之间加一空格。如:for(expr1; expr2; expr3)
二元操作符和操作数之间应该用空格隔开。如:i + c ;
强制类型转换时,在类型和变量之间加一空格。如:(int) i ;
3. 注释
3.1. 注释的基本约定
3.1.1 注释的基本约定
3.1.2 注释应该增加代码的清晰度
3.1.3 保持注释的简洁,不是任何代码都需要注释的,过多的注释反而会影响代码的可读性
3.1.4 注释不应该包括其他的特殊字符
3.1.5 先写注释,后写代码
3.2. 注释类型
3.2.1 块注释
块注释:主要用来描述文件,类,方法,算法等。一般用在文档和方法的前面,也可以放在文档的任何地方。以‘/*’开头,‘*/’结尾。例:
……
/*
* 注释
*/
……
3.2.2 行注释
行注释:主要用在方法内部,对代码,变量,流程等进行说明。与块注释格式相似,但是整个注释占据一行。例:
……
/* 注释 */
……
3.2.3 尾随注释
尾随注释:与行注释功能相似,放在代码的同行,但是要与代码之间有足够的空间,便于分清。例:
int m=4 ; /* 注释 */
如果一个程序块内有多个尾随注释,每个注释的缩进应该保持一致。
3.2.4 行尾注释
行尾注释:与行注释功能相似,放在每行的最后,或者占据一行。以‘//’开头或以‘///’开头。
3.2.5 文档注释
文档注释:与块注释相似,但是可以被javadoc处理,生成HTML文件。以‘/**’开头,‘*/’结尾。问挡住是不能放在方法或程序块内。例:
/**
注释
*/
3.3. 注释那些部分
项目
注释哪些部分
实参/
参数
参数类型
参数用来做什么
任何约束或前提条件
示例
字段/
字段/属性
字段描述
注释所有使用的不变量
示例
并行事件
可见性决策
类
类的目的
已知的问题
类的开发/维护历史
注释出采用的不变量
并行策略
编译单元
每一个类/类内定义的接口,含简单的说明
文件名和/或标识信息
版权信息
接口
目的
它应如何被使用以及如何不被使用
局部变量
用处/目的
成员函数注释
成员函数做什么以及它为什么做这个
哪些参数必须传递给一个成员函数
成员函数返回什么
已知的问题
任何由某个成员函数抛出的异常
可见性决策
成员函数是如何改变对象的
包含任何修改代码的历史
如何在适当情况下调用成员函数的例子适用的前提条件和 后置条件
成员函数内部注释
控制结构
代码做了些什么以及为什么这样做
局部变量
难或复杂的代码
处理顺序
4. 命名
4.1. 命名的基本约定
4.1.1 一般应该使用可以准确说明变量/字段/类/命令空间的完整的英文描述符,如firstName。对一些作用显而易见的变量可以采用简单的命名,如在循环里的递增(减)变量就可以被命名为 ” i ”。
4.1.2 尽量采用项目所涉及领域的术语。
4.1.3可以采用大小写混合,提高名字的可读性。
4.1.4尽量少用缩写,但如果一定要使用,就要谨慎地使用。同时,应该保留一个标准缩写的列表,并且在使用时保持一致。
4.1.5避免使用长名字(最好不超过 15 个字母)。
4.1.6避免使用相似或者仅在大小写上有区别的名字。
4.1.7避免使用下划线作为名字的首末字母。
4.2. 标示符的命名约定
标示符类型
命名约定
例子
命令空间
(文件名)namespace
l 全部小写。
l 标识符用点号分隔开来。为了使包的名字更易读,建议命令空间中的标识符用点号来分隔。
局部包:
interface.screens
类,接口
l 类的名字应该使用名词。
l 每个单词第一个字母应该大写。
l 避免使用单词的错写,除非它的缩写已经广为人知,如HTTP。
Class Hello ;
Class HelloWorld ;
Interface Apple ;
方法
l 第一个单词一般是动词。
l 第一个字母是小些,但是中间单词的第一个字母是大写。
l 如果方法返回一个成员变量的值,方法名一般为get+成员变量名,如若返回的值是bool变量,一般以is作为前缀。
l 如果方法修改一个成员变量的值,方法名一般为:set + 成员变量名。
l 如果方法返回一个结束结束集或字符串,方法名一般为:do+成员变量名.
getName();
setName();
isFirst();
doAddressSearch();
变量
l 第一个字母小写,中间单词的第一个字母大写。
l 不要用_或&作为第一个字母。
l 尽量使用短而且具有意义的单词。
l 单字符的变量名一般只用于生命期非常短暂的变量。i,j,k,m,n一般用于integers;c,d,e一般用于characters。
l 如果变量是集合,则变量名应用复数。
l 命名组件采用匈牙利命名法,所有前缀均应遵循同一个组件名称缩写列表。
String myName;
int i;
int n;
char c;
int[] students;
btNew;
(bt是Button的缩写)
常量
l 所有常量名均全部大写,单词间以‘_’隔开。
int MAX_NUM;
5. 声明
5.1 每行应该只有一个声明。
5.2 局部变量必须初始化。
5.3 除了for循环外,声明应该放在块的最开始部分。for循环中的变量声明可以放在for语句中。如:for(int i=0;i<10;i++) 。
5.4 避免块内部的变量与它外部的变量名相同。
6. 表达式和语句
6.1 每行应该只有一条语句。
6.2 if-else,if-elseif语句,任何情况下,都应该有“{”,“}”;
6.3 循环语句使用在数组数据或数据集判断时,考虑使用foreach,如:
foreach (LoginInfo loginInfo in loginInfos)
其他地方考虑为FOR 或WHILE
for 循环的语法
for (expr1; expr2; expr3)
{
// statements;
}
foreach 循环的语法
foreach (string s in arr)
{
// statements;
}
while 和 do...while 循环的语法
while (condition)
{
// statements
}
do
{
// statements
}
while(condition);
6.4 switch语句,每个switch里都应包含default子语句,格式如下:
switch (condition) {
case ABC:
statements;
break;
case DEF:
statements;
break;
case XYZ:
statements;
break;
default:
statements;
break;
}
6.5 try-catch语句格式如下:
try
{
statements;
} catch (ExceptionClass e)
{
statements;
} finally {
statements;
}
7. 错误处理和异常事件
不要“捕捉了异常却什么也不做”。如果隐藏了一个异常,你将永远不知道异常到底发生了没有。
发生异常时,给出友好的消息给用户,但要精确记录错误的所有可能细节,包括发生的时间,和相关方法,类名等。
别写太大的 try-catch 模块。如果需要,为每个执行的任务编写单独的 try-catch 模块。 这将帮你找出哪一段代码产生异常,并给用户发出特定的错误消息
如果应用程序需要,可以编写自己的异常类。自定义异常不应从基类SystemException派生,而要继承于. IApplicationException。
8. 可移植性
8.1 尽量不要使用已经被标为不赞成使用的类或方法。
8.2 对于声明与后台对接的数据表类,必须进行序列号,在类文件中需加入[Serializable]关键字,如
namespace geelyqns
{
[Serializable]
public class ClassName
{
//
}
}
内部参考文件
C#开发规范
Last printed 1月/05/2025 | Page 13 of 13
展开阅读全文