C#&Net-通用编码规范

密  级:

文档编号:

1、总则

编码规范(C# VB.NET,此规范适用于B/S和C/S所有模式),力求简洁,优先度依次为正确、可读性、效率高。参考了匈牙利命名法和NET简明编码规范。

2、基本原则

  1. 名称中不能出现下划线_(成员变量和全局变量除外)
  2. 灵活使用变量的前缀。(常用的基本类型需要前缀,其它的不需要)
  3. 运算符前后需要空格。例:strColNo = strColNo.ToUpper() ;  
  4. 注释越详细越好。
  5. 合理控制类、方法、变量的长度。类不能超过2000行,方法不能超过200行,变量命名不超过30个字符。
  6. 控制方法的参数个数,尽量不超过5个入参。方法过长,超过一屏显示,需要折行处理。
  7. 控制return 的个数,尽量在方法体内只有一个出口。
  8. 尽量不使用goto语句
  9. 在SQL语句中,关键字需要大写,其它为小写。例:SELECT userName,age FROM User
  10. 全局变量,使用static 或 const形式,在指定位置统一定义, 禁止在页面中使用static变量。
  11. 不要在表现层自己定义的方法中,直接出现返给用户的信息!
  12. 谨慎使用临时变量,如strTemp、intTemp等,会使代码的可读性变差。
  13. 不要在对象内释放自身(如this.Close();),应该在对象的调用处释放你所调用的对象。
  14. 不要把非表现层捕获的错误直接抛给用户!
  15. 为了达到方法级的封装,建议在UI层多写static 方法。
  16. 删除你的冗余代码,和不参与工作的代码。
  17. 尽量减少方法内的局部变量个数,当发现变量过多时,通过重构拆分出新的方法。
  18. 用Region折叠每一个方法,所有的私有方法用同一个Region在最外面包含。时刻保持页面整齐。
  19. 及时释放你不需要的对象,不要等垃圾回收来处理。
  20. 不要泛用try catch,这会耗费很多的性能。
  21. 正确使用数据库句柄,原则是:最晚打开!最短使用!最快关闭!
  22. 不要使用析构函数,因为析构函数的调用时间由垃圾回收器来决定。

3、页面代码规范

  1. 控件命名规范

页面中,所有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

  1. HTML代码书写规范

Html标记是页面代码的主要组成部分。需要遵循以下规范:

  1. 所有标记必须含有结束标记。单标记除外,如<br>。
  2. 标记的结束标记同其最后一个子标记放在一行。如果没有子标记,则同开始标记放在一行,或者垂直对齐。
  3. 所有标记不得交叉嵌套。例如:<font><p>abcd</font></p>
  4. 子标记和父标记必须有垂直缩进,缩进字符采用tab。上下向内缩进一个Tab键。不可采用空格作为缩进字符
  5. 标记中属性值必须使用双引号包围。
  6. 如果一个标记中,需要赋值的属性过长,可以换行。第二行和标记的开始位置上下差两个tab键。第二行开始同以下行左对齐。

4、代码书写规范(c#)

4.1、NameSpace规范

  1. 使用 公司名.产品名 这样的格式

公司所有的Namespace推荐以Sunnyee开头.例如网站的酒店频道为Sunnyee.Web.Hotel。(历史原因,新机票的命名空间不是这个规范)
Namespace中类的依赖关系应该体现在命名上,比如System.Web.UI.Design中的类依赖于System.Web.UI

  1. 在语意合适的情况下使用复数,比如System.Collections
  2. 名称空间命名遵循第一个字母大写。其后每一个单词第一个字母大写的法则。以便同dotnet framework中的名称空间相吻合。
  3. 类名不可和名称空间的名字相同
  4. 名称空间的命名要具有实际的含义,能够概括所含类的功能。如WebUI.Examination.
  5. 同一个名称空间的类代码文件要放在同一个目录中。目录的名字为命名空间的名。

4.2、类名称规范

  1. Type前缀可选。

如果不使用前缀,类名称每一个单词第一个字母必须大写,用于和实例区分。例:FileManage fileManage; FileManage为类的定义,fileManage为实例,实例的首字母为小写。

如果使用前缀,用小写的cls为前缀,如clsCommon。

  1. 类名中不使用下划线。
  2. 类代码所在目录名必须同类所属名称空间名相同
  3. 类名应该有实际意义,保守地使用缩写。    
  4. 在合适的时候,使用单词复合来标识从某个基类继承而来。比如xxxException。
  5. 抽象类的命名同上。

4.3、Interface 命名规范  

  1. 使用名词或者名词性词组命名Interface
  2. 保守地使用缩写
  3. 在interface 名称前加上字母I来表示type,例:IDisposable

4.4、Attribute 命名规范

总是给Attribute类加上Attribute后缀。

  1. Enumeration和 strut命名规范
  2. 枚举类型定义,需要前缀E,例:EDataBaseType
  3. 结构体类型定义,需要前缀S,例:SField

4.5、方法名称规范

方法名称必须使用动词或者动词性词组的形式。如GetUserName()

方法中的参数命名参照“4.8变量命名规范”。

用于接收返回值的变量,如果是在方法外部实例的,需要ref 声明,如果是在方法内部实例的,需要out 实例。

例:    

public  int GetFileNameNoPath(string strPathFileName,out string strFileName)

4.6、Event 命名规范

  1. 在event handler名字中使用EventHandler后缀
  2. 指定两个名字分别为sender和e的参数。sender参数代表了发出事件的对象。sender参数总是类型object,即使可能使用一个更加精确的类型。和事件相关的状态封装在名字为e的event class的实体之中。给e指定恰当而且明确的event class。
  3. 使用EventArgs后缀命名事件参数class
  4. 考虑使用动词命名事件。使用进行时态来标识事件正在进行之中,使用完成时态标识事件已经完成,不要使用BeforeXxx/AfterXxx命名法。
  5. 不要在事件声明中使用前缀和后缀,比如,用Close而不是OnClose。
  6. 一般的,你应该同时提供一个名字为OnXxx的protected method供派生类来改写。

4.7、属性名称规范

  1. 属性命名不能有前缀。
  2. 属性名称应该能够体现属性的含义。可以通过使用一定的名词词组来实现。例如ColumnName.
  3. 属性应该尽量少的使用直接暴露变量为公共成员的方式。而应该使用get和set.例如:
    public bool IsWrite
    {
        get
        {
            return m_blnIsWrite;
        }
        set
        {
            m_blnIsWrite = value;
        }
    }
  4. 属性名称不可同类名称、方法名称相同

4.8、变量命名规则

  1. 所有的值类型和String的命名尽量采用匈牙利命名法。即变量为三部分组成,“范围_+类型+名称”。
  2. 局部变量格式例:
    整型(int):int           如:intCount
    长整型(long):lng         如lngLength          
    无符号整型(uint):unt
    短整型(short):sht
    字符串(string):str
    布尔类型(bool):bln
    浮点类型(float):flt
    双精度类型(double):dbl
    字节类型(byte):byt

数组的前缀用sz,   如szUserList

动态数组的前缀用arr,如arrUserList

 

  1. 成员变量的前缀为m,如m_strUserName
  2. 全局变量的前缀为g,如g_intCount
  3. 引用型数据的实例命名,局部变量不需前缀,但首字母一定要小写。例:
    Account account;成员级仍然需要m_的前缀,例Account m_account;
  4. 数组或动态数组采用非前缀法命名,名称尾部必须要有复数形式的类型说明。
    例:Byte[] hashedBytes;
  5. 值类型和string 变量如采用新的命名法,格式如下:
    cleanString hashedString ,尾部应该有type标记。

4.9、注释

  1. 每一个类、方法、属性前必须含有注释。其中类、属性写明其主要用处。方法写明其主要用处和参数的含义,采用C#标准文档格式。
  1. 命名空间及类库声明:

[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("")]

  1. 文件和类注释:

/// <summary>

///   名  称:clsDatabase

///   功能描述:封装了所有的数据库操作(ACCESS、EXCEL、SQL-SERVER、MySql、ORACLE)

///   作    者:习明凡

///   创建日期:2012-10-21

///   备    注:许多接口待增

/// </summary>

  1. 方法注释:

/// <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)

  1. 代码段注释说明:采用#region 和#endregion 折叠说明

 

  1. 代码中关键部分,需要加入注释文字,全用中文,不允许用拼音。
  2. 每个变量后面必须注释其用途。
  3. 每个较为独立的程序段落(while、for、if等)要明确分隔,程序段落前用注解说明该段程序的功能。关键语句要注解。
  4. 若对程序进行了修改,需要用注解标识出修改的起始处和终止处,并在开始处标出修改者和修改日期,尽量不要删除原先的代码。

5、     代码结构规范

  1. 代码必须保持一定的缩进规则。{下的代码块必须向内缩进一个Tab键。}同向上最近的{垂直对齐。
  2. 同类型的变量,一行可以定义多个 例:int intCount,intNum,intSequence。需要注释的变量,一行只定义一个。
  3. 局部变量保持最小的有效域。例如循环语句中的循环变量i:
    错误写法:
    int i = 0;
    for(i=0;i<aryA.Length;i++){}
    正确写法:
    for(int i=0;i<aryA.Length;i++){}
    这样可以保证i的作用域只在for代码块内。
  4. 范例如下:

     #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();

 

}

注意事项:

  1. 所有变量在调用前必须被初始化。
  2. 对所有的用户输入,必须进行合法性检查。
  3. 不要比较浮点数的相等,如: 10.0 * 0.1 == 1.0

7、层次结构规范

    1. 尽量保证代码的重用性,每个类代码行数尽量不要超过2000行。
    2. 采用三层架构设计系统结构。界面、业务、数据访问三层要分开。
    3. 不能在业务层和数据层出现表现层的控件信息。
    4. 不能在业务层出现数据库的连接串。
    5. 不能在表现层出现SQL语句,不能在表现层调用数据库对象。
posted @ 2013-12-28 11:07  Alum  阅读(627)  评论(0编辑  收藏  举报