Net"/>
C#Net
密 级:
文档编号:
1、总则
编码规范(C# VB.NET,此规范适用于B/S和C/S所有模式),力求简洁,优先度依次为正确、可读性、效率高。参考了匈牙利命名法和NET简明编码规范。
2、基本原则
- 名称中不能出现下划线_(成员变量和全局变量除外)
- 灵活使用变量的前缀。(常用的基本类型需要前缀,其它的不需要)
- 运算符前后需要空格。例:strColNo = strColNo.ToUpper() ;
- 注释越详细越好。
- 合理控制类、方法、变量的长度。类不能超过2000行,方法不能超过200行,变量命名不超过30个字符。
- 控制方法的参数个数,尽量不超过5个入参。方法过长,超过一屏显示,需要折行处理。
- 控制return 的个数,尽量在方法体内只有一个出口。
- 尽量不使用goto语句
- 在SQL语句中,关键字需要大写,其它为小写。例:SELECT userName,age FROM User
- 全局变量,使用static 或 const形式,在指定位置统一定义, 禁止在页面中使用static变量。
- 不要在表现层自己定义的方法中,直接出现返给用户的信息!
- 谨慎使用临时变量,如strTemp、intTemp等,会使代码的可读性变差。
- 不要在对象内释放自身(如this.Close();),应该在对象的调用处释放你所调用的对象。
- 不要把非表现层捕获的错误直接抛给用户!
- 为了达到方法级的封装,建议在UI层多写static 方法。
- 删除你的冗余代码,和不参与工作的代码。
- 尽量减少方法内的局部变量个数,当发现变量过多时,通过重构拆分出新的方法。
- 用Region折叠每一个方法,所有的私有方法用同一个Region在最外面包含。时刻保持页面整齐。
- 及时释放你不需要的对象,不要等垃圾回收来处理。
- 不要泛用try catch,这会耗费很多的性能。
- 正确使用数据库句柄,原则是:最晚打开!最短使用!最快关闭!
- 不要使用析构函数,因为析构函数的调用时间由垃圾回收器来决定。
3、页面代码规范
- 控件命名规范
页面中,所有HTML控件都需要使用跟控件类型相关的前缀,以三个字母为佳。常用类型和前缀对应表如下:
对象类型 | 前缀 | 例子 |
Check box | chk | chkReadOnly |
Combo box | cmb | cmbUserList |
drop-own list box | drp | drpUserList |
Command button | btn | btnExit |
Common dialog | dlg | dlgFileOpen |
DataGrid | dgr | dgrUserList |
ListBox | lst | lstTarget |
Form | frm | frmEntry |
Frame | fram | framLanguage |
Image | img | imgIcon |
Label | lbl | lblHelpMessage |
OLE | ole | oleWorksheet |
Text box | txt | txtLastName |
radio | rdo | rdoUserName |
TreeView | trv | trvOrganization |
RichTextBox | rtb | rtbReport |
- HTML代码书写规范
Html标记是页面代码的主要组成部分。需要遵循以下规范:
- 所有标记必须含有结束标记。单标记除外,如<br>。
- 标记的结束标记同其最后一个子标记放在一行。如果没有子标记,则同开始标记放在一行,或者垂直对齐。
- 所有标记不得交叉嵌套。例如:<font><p>abcd</font></p>
- 子标记和父标记必须有垂直缩进,缩进字符采用tab。上下向内缩进一个Tab键。不可采用空格作为缩进字符
- 标记中属性值必须使用双引号包围。
- 如果一个标记中,需要赋值的属性过长,可以换行。第二行和标记的开始位置上下差两个tab键。第二行开始同以下行左对齐。
4、代码书写规范(c#)
4.1、NameSpace规范
- 使用 公司名.产品名 这样的格式
公司所有的Namespace推荐以Sunnyee开头.例如网站的酒店频道为Sunnyee.Web.Hotel。(历史原因,新机票的命名空间不是这个规范)
Namespace中类的依赖关系应该体现在命名上,比如System.Web.UI.Design中的类依赖于System.Web.UI
- 在语意合适的情况下使用复数,比如System.Collections
- 名称空间命名遵循第一个字母大写。其后每一个单词第一个字母大写的法则。以便同dotnet framework中的名称空间相吻合。
- 类名不可和名称空间的名字相同
- 名称空间的命名要具有实际的含义,能够概括所含类的功能。如WebUI.Examination.
- 同一个名称空间的类代码文件要放在同一个目录中。目录的名字为命名空间的名。
4.2、类名称规范
- Type前缀可选。
如果不使用前缀,类名称每一个单词第一个字母必须大写,用于和实例区分。例:FileManage fileManage; FileManage为类的定义,fileManage为实例,实例的首字母为小写。
如果使用前缀,用小写的cls为前缀,如clsCommon。
- 类名中不使用下划线。
- 类代码所在目录名必须同类所属名称空间名相同
- 类名应该有实际意义,保守地使用缩写。
- 在合适的时候,使用单词复合来标识从某个基类继承而来。比如xxxException。
- 抽象类的命名同上。
4.3、Interface 命名规范
- 使用名词或者名词性词组命名Interface
- 保守地使用缩写
- 在interface 名称前加上字母I来表示type,例:IDisposable
4.4、Attribute 命名规范
总是给Attribute类加上Attribute后缀。
- Enumeration和 strut命名规范
- 枚举类型定义,需要前缀E,例:EDataBaseType
- 结构体类型定义,需要前缀S,例:SField
4.5、方法名称规范
方法名称必须使用动词或者动词性词组的形式。如GetUserName()
方法中的参数命名参照“4.8变量命名规范”。
用于接收返回值的变量,如果是在方法外部实例的,需要ref 声明,如果是在方法内部实例的,需要out 实例。
例:
public int GetFileNameNoPath(string strPathFileName,out string strFileName)
4.6、Event 命名规范
- 在event handler名字中使用EventHandler后缀
- 指定两个名字分别为sender和e的参数。sender参数代表了发出事件的对象。sender参数总是类型object,即使可能使用一个更加精确的类型。和事件相关的状态封装在名字为e的event class的实体之中。给e指定恰当而且明确的event class。
- 使用EventArgs后缀命名事件参数class
- 考虑使用动词命名事件。使用进行时态来标识事件正在进行之中,使用完成时态标识事件已经完成,不要使用BeforeXxx/AfterXxx命名法。
- 不要在事件声明中使用前缀和后缀,比如,用Close而不是OnClose。
- 一般的,你应该同时提供一个名字为OnXxx的protected method供派生类来改写。
4.7、属性名称规范
- 属性命名不能有前缀。
- 属性名称应该能够体现属性的含义。可以通过使用一定的名词词组来实现。例如ColumnName.
- 属性应该尽量少的使用直接暴露变量为公共成员的方式。而应该使用get和set.例如:
public bool IsWrite
{
get
{
return m_blnIsWrite;
}
set
{
m_blnIsWrite = value;
}
} - 属性名称不可同类名称、方法名称相同
4.8、变量命名规则
- 所有的值类型和String的命名尽量采用匈牙利命名法。即变量为三部分组成,“范围_+类型+名称”。
- 局部变量格式例:
整型(int):int 如:intCount
长整型(long):lng 如lngLength
无符号整型(uint):unt
短整型(short):sht
字符串(string):str
布尔类型(bool):bln
浮点类型(float):flt
双精度类型(double):dbl
字节类型(byte):byt
数组的前缀用sz, 如szUserList
动态数组的前缀用arr,如arrUserList
- 成员变量的前缀为m,如m_strUserName
- 全局变量的前缀为g,如g_intCount
- 引用型数据的实例命名,局部变量不需前缀,但首字母一定要小写。例:
Account account;成员级仍然需要m_的前缀,例Account m_account; - 数组或动态数组采用非前缀法命名,名称尾部必须要有复数形式的类型说明。
例:Byte[] hashedBytes; - 值类型和string 变量如采用新的命名法,格式如下:
cleanString hashedString ,尾部应该有type标记。
4.9、注释
- 每一个类、方法、属性前必须含有注释。其中类、属性写明其主要用处。方法写明其主要用处和参数的含义,采用C#标准文档格式。
- 命名空间及类库声明:
[assembly: AssemblyTitle("Alum.Net")]
[assembly: AssemblyDescription("Net常用集合")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Alum")]
[assembly: AssemblyProduct("Alum.Net")]
[assembly: AssemblyCopyright("Copyright ©Alum 2013")]
[assembly: AssemblyTrademark("Alum")]
[assembly: AssemblyCulture("")]
- 文件和类注释:
/// <summary>
/// 名 称:clsDatabase
/// 功能描述:封装了所有的数据库操作(ACCESS、EXCEL、SQL-SERVER、MySql、ORACLE)
/// 作 者:习明凡
/// 创建日期:2012-10-21
/// 备 注:许多接口待增
/// </summary>
- 方法注释:
/// <summary>
/// 根据给定邮件和密码,返回客户对象.
/// <param name="emailAddress">客户的邮件.</param>
/// <param name="password">客户的密码.</param>
/// <retvalue>客户对象或null.</retvalue>
/// <exception> class='System.ApplicationException'>
///邮件和密码为空.
///</exception>
/// </summary>
public CustomerData GetCustomerByEmail(String emailAddress, String password)
- 代码段注释说明:采用#region 和#endregion 折叠说明
- 代码中关键部分,需要加入注释文字,全用中文,不允许用拼音。
- 每个变量后面必须注释其用途。
- 每个较为独立的程序段落(while、for、if等)要明确分隔,程序段落前用注解说明该段程序的功能。关键语句要注解。
- 若对程序进行了修改,需要用注解标识出修改的起始处和终止处,并在开始处标出修改者和修改日期,尽量不要删除原先的代码。
5、 代码结构规范
- 代码必须保持一定的缩进规则。{下的代码块必须向内缩进一个Tab键。}同向上最近的{垂直对齐。
- 同类型的变量,一行可以定义多个 例:int intCount,intNum,intSequence。需要注释的变量,一行只定义一个。
- 局部变量保持最小的有效域。例如循环语句中的循环变量i:
错误写法:
int i = 0;
for(i=0;i<aryA.Length;i++){}
正确写法:
for(int i=0;i<aryA.Length;i++){}
这样可以保证i的作用域只在for代码块内。 - 范例如下:
#region "把整型的列号转变为字符型//intColNoToStrColNo"
///
/// 函数名称:IntegerColNoToStrColNo
/// 功能描述:把整型的列号转变为字符型,即1变为A
/// 作 者:肖海鹏
/// 创建日期:2003-12-18
/// 备 注:单元格从A1开始,对应到标号为(1,1),没有(0,0)的标号
///
/// </summary>
/// <param name="intColNo">传入的列标号</param>
/// <returns></returns>
public static string IntegerColNoToStrColNo(int intColNo)
{
int intTemp, intLeaving, intCount;
string strReturn, strTemp;
ArrayList arrLeaving; //1)局部变量定义在方法首部,有利于变量的统一规划
//2)此处需要空行
arrLeaving = new ArrayList();
strReturn = ""; //3)在此处进行变量的统一初始化
//4)此处需要空行
try
{
intColNo -= 1 ; //先加1,Z为26,在1到26之间调整,不是0到25
intLeaving = intColNo;
while( intLeaving > 25 )
{
intTemp = (int) Math.Floor(intLeaving / 26);
arrLeaving.Add(intLeaving - 26 * intTemp); //余数
intLeaving = intTemp;
}
arrLeaving.Add(intLeaving) ;
intCount = arrLeaving.Count;
for( int ii=0;ii<intCount;ii++)
{
intTemp = (int) arrLeaving[ii];
if(ii==0)
intTemp += 1;
strTemp = ((char) (intTemp + 64)).ToString() ;
arrLeaving[ii] = strTemp ; //改变数值为字母
}
for( ii=intCount-1 ;ii >= 0;ii--)
{
strReturn += arrLeaving[ii];
}
}
catch( Exception ex)
{
//5)此处记录错误日志
clsCommon.ErrLog(ex.Source, ex.Message, "clsReport->strColNoToIntColNo");
}
//6)此处需要空行
return strReturn;
}
#endregion
6、容错处理
程序必须进行出错处理,规范的容错语句如下:
try
{
//可能出错的代码
}
catch(Eception ex)
{
//记录错误原因和位置
clsCommon.ErrLog(ex.stack,ex.message,”文件位置->方法位置”)
}
finally
{
//注意: 对象在此处释放,对象释放前必须要判断
if(user !=null)
user.dispose();
}
注意事项:
- 所有变量在调用前必须被初始化。
- 对所有的用户输入,必须进行合法性检查。
- 不要比较浮点数的相等,如: 10.0 * 0.1 == 1.0
7、层次结构规范
-
- 尽量保证代码的重用性,每个类代码行数尽量不要超过2000行。
- 采用三层架构设计系统结构。界面、业务、数据访问三层要分开。
- 不能在业务层和数据层出现表现层的控件信息。
- 不能在业务层出现数据库的连接串。
- 不能在表现层出现SQL语句,不能在表现层调用数据库对象。
转载于:.html
更多推荐
C#Net
发布评论