C#编码规范

 

 

 

           

目的         3

范围         3

规范内容         3

代码格式         3

注释(COMMENT)规范         4

模块(类)注释规范      4

类属性注释规范      5

方法注释规范6

代码间注释规范      6

变量(VARIABLE)命名规范   7

程序文件(*.cs)中的变量命名规范  7

控件命名规则8

常量命名规范10

类(CLASS)命名规范    10

类的实例命名规范10

接口(INTERFACE)命名规范10

方法(METHOD)、属性(ATRIBUTE)命名规范   11

命名空间(NAMESPACE)命名规范        11

窗口(FORM)命名规范      11

编码实践经验11

附件:    12

 

 

 

目的

为了保证所每个项目组编写出的程序都符合相同的规范,便于理解和维护,便于检查、减少出错概率,有助于成员间交流,保证一致性、统一性而建立的C#程序编码规范。

范围

该规范适用于所有基于C#开发的.Net平台项目。

规范内容

代码格式

       所有的缩进为4个空格,使用VS.NET的默认设置。

 

       在代码中垂直对齐左括号和右括号。

if (x == 0)

{

Response.Write("用户编号必须输入!");

}

不允许以下情况:

 

if (x == 0) {

                           Response.Write("用户编号必须输入!");

}

或者:

if (x == 0){ Response.Write("用户编号必须输入!");}

 

       为了防止在阅读代码时滚动源代码编辑器,每行代码或注释在1024*768的分辨率下尽量不超过一显示屏。

       当一行被分为几行时,将串联运算符放在每一行的末尾而不是开头,清楚地表示没有后面的行是不完整的。缩进方式采用默认格式。

       每一行上放置的语句避免超过一条。

       在大多数运算符之前和之后使用空格,这样做时不会改变代码的意图却可以使代码容易阅读。例:

                 int j = i + k;

而不应写为

            int j=i+k;

       将大的复杂代码节分为较小的、易于理解的模块。

       编写 SQL 语句时,建议(不强求)对于关键字使用全部大写,对于数据库元素(如表、列和视图)使用大小写混合。

       将每个主要的 SQL 子句放在不同的行上,这样更容易阅读和编辑语句,例如:

SELECT FirstName, LastName

FROM Customers

WHERE State = 'WA'

       使用括号的目的必须是在表达上不但能够标明优先顺序,而且有助于使表达更简单明了。另外,如果某一段代码有可能产生歧义,也需加括号。

 

注释(Comment)规范

注释规范包括:模块(类)注释规范、类属性注释规范、方法注释规范、代码间注释规范。

模块(类)注释规范

模块开始尽量以以下形式书写模块注释:

/********************************************************

*新增日期:2004.7.19

*作者:XXX

*內容说明: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

*修改日期:

*修改人:

*修改说明:

*修改日期:

*修改人:

*修改说明:

。。。

*版本号(version)1.0.0

*公司(copyright):杭州电子科技大学

*创建标识:DepartmentBLL20071217

********************************************************/

 

注:这里的修改人,是指对整个类进行修改过,需要在这些添加修改记录。且记录累加。

当模块有重大修改或修改他人代码时,必须添加以下注释:

/*****************************************************

                 * Log编号:<Log编号,从1开始一次增加>

                 * 修改描述:<对此修改的描述>

                 * 作者:修改者中文名

            * 修改日期:<模块修改日期,格式:YYYY-MM-DD>

* Log编号:<Log编号,从1开始一次增加>

                 * 修改描述:<对此修改的描述>

                 * 作者:修改者中文名

            * 修改日期:<模块修改日期,格式:YYYY-MM-DD>

 

        ***************************************************/

修改时根据需要保留程序员第一次和最近一次修改的代码。具体办法是将原有代码注释。

(保留第一次的代码可以反映此部分代码最初要实现的功能及其初始编程思想,保留最新的代码可以反映此代码最近变化要实现的最新功能)

注:

1.     "*"的长度要大于内容的最后一个字符。上下长度要一致。

2.     修改的注释,就添加在功能模块的说明的上方,即"///"的说明的上方同一级别的缩进里。

3.     注释的内容格式需要注意:*Log编号(即内容)之间要有一个空格。

例如:* Log编号:(对的),*Log编号:(错的)

类属性注释规范

在类的属性必须以以下格式编写属性注释:

                 /// <summary>

                 ///属性说明

                 /// </summary>

方法注释规范

在类的方法声明前必须以以下格式编写注释:

                 /// </summary>

        ///函数的作用

                 /// <param name="<参数名称>"><参数说明></param>

                 /// <returns><对方法返回值的说明,该说明必须明确说明返回的值代表什么含义> </returns>

        ///<exception>异常类型、异常结果说明(为什么产生此异常)</exception>

Visual Studio环境中,在方法中上一行中输入"///",开发环境会自动生成注释模板。

例如:

 

/// <summary>

/// 构造函数

/// </summary>

/// <param name='is_xxx1'>示例参数1</param>

/// <param name='is_xxx2'>示例参数2</param>

 

public UpgradeThread(string is_xxx1, string is_xxx2)

{

}

 

代码间注释规范

代码间注释分为单行注释和多行注释。

 单行注释:

//<单行注释>(不提倡使用,尽量都使用/**/

 多行注释:

                 /*多行注释1

                  *多行注释2

                  *多行注释3*/

代码中遇到语句块(ifcase……)或实现一个逻辑功能时,必须添加注释。添加的注释应该能够说明此语句块的作用和实现手段(所用算法等等)。注释应添加在所说明语句同一级别的缩进里。

注:

1.     "*"的长度要大于内容的最后一个字符。上下长度要一致。

2.     修改的注释,就添加在功能模块的说明的上方,即"///"的说明的上方同一级别的缩进里。

3.     注释的内容格式需要注意:*Log编号(即内容)之间要有一个空格。

例如:* Log编号:(对的),*Log编号:(错的)

 

变量(Variable)命名规范

程序文件(*.CS)中的变量命名规范 

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

1  类模块级的变量用"_"作前缀,每个单词的第一个首字母小写,第二单词开始首字母大写。

public class Hello

{

                                    private string _firstName;

                                    private DateTime _date;

}

2  过程级的变量不使用前缀, 第一个字母小写,其他单词的首字母大写。

public class Hello

{

                 void say()

                 {

                           string sayWord;

                 }

}

3  过程的参数不使用前缀, 第一个字母小写,其他单词的首字母大写。

        public class Hello

        {

                 void say(string sayWord)

                 {

                 }

        }

        补充说明:针对异常捕获过程中的Exception变量命名,统一命名为ex1ex2……

try

{

        // code1

        try

        {

                 // code2

        }

        catch(Exception ex2)

        {

                 //your code

        }

}

catch(Exception ex1)

{

                 //your code

}

如果捕获异常不需要作任何处理,则不需要定义Exception实例。

例:

try

{

        //your code

}

catch( Exception )

{

}

4  鉴于大多数名称都是通过连接若干单词构造的,请使用大小写混合的格式以简化它们的阅读。除首单词外,每个单词的第一个字母都是大写。例如:oracleConnection

5  即使对于可能仅出现在几个代码行中的生存期很短的变量,仍然使用有意义的名称。仅对于短循环索引使用单字母变量名,如 i j

6  在变量名中使用互补对,如 min/maxstart/end open/close

7  不要使用原义数字或原义字符串,如 for (int i = 0;i < 7;i++)。而是使用命名常数,如for ( int i = 0;i < DAYS_IN_WEEK;i++),以便于维护和理解。

8.类成员变量声明时,应放在类的顶部。

控件命名规则

控件命名=控件缩写前缀+变量具体释义。

 

控件名称         前缀例子

Button     btn   btnSubmit

CheckBox         chk   chkReadOnly

ComboBox       cbo   cboEnglish

Command         cmd  cmdDelete

Connection      con   conOracle

DataAdapter    dad   dadDiction

DataColumn     dcol  dcolDiction

DataGrid  dgd   dgdTitles

DataReader      dtr    dtrDiction

DataRelation    drel  drelDiction

DataRow  drow         drowDiction

DataSet    dst    dstDiction

DataTable         dtbl  dtblDiction

DataViewdvw  dvwDiction

DateTimePicker        dtp   dtpPublished

DropDownListdrp   drpOffice

Form        frm   frmMain

ImageListils      ilsAllIcons

Label        lbl     lblHelpMessage

ListBox     lst     lstPolicyCodes

ListView   lvw   lvwHeadings

Menu       mnumnuFileOpen

MonthCalender        mcd  mcdPeriod

Parameter        parm         parmIn

PictureBox       pic    picVGA

ProgressBar     prg   prgLoadFile

RadioButton     rad   radGender

RichTextBox     rtf     rtfReport

StatusBarsta    staDateTime

TabControl       tab    tabOptions

TextBox   txt     txtLastName

ToolBar    tlb     tlbActions

TreeView          tre    treOrganization

ScriptManager          smg  smgContent

UpdatePanel    upd  updQuery

Panel       pl      plQuery

GridViewgrv    grvShow

UpdateProgress       upp  uppUpdate

MultiView         mul   mulContent

View         vie    vieAdd

FormView         fvi     fviAdd

HiddenField     hf      hfMian

ObjectDataSource   ods   odsData

DynamicPopulateExtender       dpe  dpeText

FilteredTextBoxExtenderftbe  ftbeNum

报表浏览控件rpt   rptMonth

用户自定义控件      ucl   uclCustom

 

常量命名规范

常量名也应当有一定的意义,格式为 NOUN NOUN_VERB。常量名均为大写,单词之间用下划线分隔。

例:

private const int WEB_DEFAULT = 3600;

private const bool WEB_LOG = false;

注:

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

类(Class)命名规范

1   名字应该能够标识事物的特性。

2   首字母大写,缩略语可以全部字母大写。

3   名字可以有两个或三个单词组成,但通常不应多于三个。

4   在名字中,每个单词的第一个字母大写。例如:IsSuperUser;包含ID的,ID全部大写,如CustomerID

5   使用名词或名词短语命名类。

4少用缩写,除非是被广泛使用的。

5不要使用下划线字符 (_)

6自定义异常类以Exception结尾。例:

public class FileStream

public class Button

public class StringException

类的实例命名规范

类的实例第一个字母小写,其他单词的第一个字母大写。

例:

FileStream fileStream=new FileStream()

接口(Interface)命名规范

        和类命名规范相同,唯一区别是接口在名字前加上"I"前缀。

        例:

        interface IDBCommand;

        interface IButton;

方法(Method)、属性(Atribute)命名规范

1方法命名应采用首字母大写的方式。

2返回值是Bool值的方法和属性以Is开头。

3使用返回值是Bool值的方法(属性)的时候,不要将bool值方法(属性)与if语句放在同一行,如应该这样写:

bool valid = IsValid();

if (valid)

{

}

不应这样写

if (IsValid())

{

}

4  其他和类命名规范相同。

5  同名方法参数少的在前,多的在后(多态)

6  类构造函数方法在类方法描述的最前。

7  按访问作用域和访问权限,权限低的(private)在前,高的(public)在后。

命名空间(NameSpace)命名规范

        和类命名规范相同。

窗口(Form)命名规范

frm+模块名称+子模块名称,其中子模块名称在模块不能细分的情况下可以省略。

主界面统一命名为:frmMain

例:

       frmMain

       frmDatasource

       frmDataSetSelect

编码实践经验

       不要混合使用递增运算符和递减运算符。

原因:在方法调用或是数学运算中混合使用递增运算符(或递减运算符)会造成欠经验的程序员阅读困难。

       Switch 语句必须有default语句。

       避免在一个语句中给多个变量赋相同的值。

a = b = c ;

应改为:

a = c ;

b = c ;

       避免在同一个文件中放置多个类。

       避免在同一个文件中使用多个命名空间。

       避免写超过5个参数的方法。如果传递多个参数,应使用结构。

       尽量使用以零为基数的数组。

       使用长字符串时,使用StringBuilder代替string

       使用String.Empty取代""

       注意不要将随发布环境变化而变化的变量写死,例如数据库连接字符串。

       变量声明后应立即赋初值。

       调试语句应及时注释掉。

附件:

using System;

 using System.Collections.Generic;

 using System.Text;

 using System.Data;

 using System.Data.SqlClient;

 using System.Data.OracleClient;

 using System.Data.Common;

 

/*****************************************

*新增日期:2007-12-24

 *作者:林啸

*内容说明:

*修改日期:

*修改人:

*修改内容:

修改日期:

*修改人:

*修改内容:

*版本号(version):1.0.0

*公司(copyright):杭州电子科技大学

*创建标识:ApplyGoodsDetail20071204

*****************************************/

 

 namespace Heading.Data

  {

      /// <summary>

      /// 模块编号:FR0403

///作用:存储发货申请明细信息表。

     /// </summary>

     /// <remarks>

     /// <c>DataHelper</c> 包含对数据库的全局操作集合,包括打开和关闭连接、创建事务等。此类支持以下 Microsoft SQL Server Oracle 版本。

     /// <list type="table">

     /// <listheader><item>Microsoft SQL Server 版本</item><description>Oracle 版本</description></listheader>

     /// <item><item><list type="bullet">

     /// <item>Microsoft SQL Server 2000</item>

     /// <item>Microsoft SQL Server 2005</item>

     /// <item>Microsoft SQL Server 2008</item>

     /// </list></item>

     /// <description><list type="bullet">

     /// <item>Oracle 8i</item><item>Oracle 9i</item><item>Oracle 10g</item><item>Oracle 11g</item>

     /// </list></description></item>

     /// </list>

     /// </remarks>

     /// <example>

     /// 以下示例展示如何使用 <c>DataHelper</c> 类执行数据库事务操作。

     /// <code lang="C#" source="Code SamplesCSharpDataHelper.cs" region="DataHelper" />

     /// <code lang="VB.NET" title="Visual Basic" source="Code SamplesVBDataHelper.vb" region="DataHelper" />

     /// <code lang="C++" source="Code SamplesC++DataHelper.cpp" />

     /// <note type="caution">

     /// <para>

     /// 此类是静态类。可在应用程序全局范围内使用,在使用此类的任何方法之前,您必须先初始化 <c>DataHelper</c>.Connection 属性。

     /// 有关 Connection 属性的信息,请参见 <see cref="T:System.Data.Common.DbConnection" />

      /// </para>

     /// </note>

     /// </example>

     /// <seealso cref="DbmsType" />

/***********************************

         * Log编号:1

         * 修改描述:删除BargainListName字段

         * 作者:魏致晟

         * 修改日期:2007-12-24

* Log编号:2

         * 修改描述:删除BargainListName字段

         * 作者:魏致晟

         * 修改日期:2007-12-24

   *************************************/

 

/// <summary>

     ///属性说明:备注

/// </summary>

public string Remark()

        {

            get { return _remark; }

            set

            {

                if (value != null && value.Length > 128)

                    throw new ArgumentOutOfRangeException("Invalid value for Remark", value, value.ToString());

                _remark = value;

            }

      }

/// <summary>                 

        /// 功能描述:按照Sql语句查询合同变更信息

        /// </summary>

        /// <param name="strWhere">传入Sql条件语句</param>

     /// <returns>IList返回BargainChange类型的列表</returns>

  public IList<BargainChange> GetBySqlBargainChange(string strWhere)

        {

            IList<BargainChange> list = new List<BargainChange>();//定义合同变更信息泛型的list

            string sql = "select * from Bargain_Changes " + strWhere;

            // invoke ExecuteReader method

            using (IDataReader reader = db.ExecuteReader(CommandType.Text, sql))

            {

                while (reader.Read())

                {

 

                     BargainChange bargainChange = new BargainChange();

 

                      int bgc_BargainChangeID = reader.GetOrdinal("BargainChange_ID");

                      if (!reader.IsDBNull(bgc_BargainChangeID))

                      {

                          bargainChange.BargainChangeID = reader.GetInt32(bgc_BargainChangeID);

 

                      }

 

                      }

          return list;

        }

     public static class DataHelper

      {

 

         // 为数据库设置连接字符串。

         private static DbConnection connection;

 

          /// <summary>

         /// 获取用于存储事务的 DbTransaction

         /// </summary>

          public static DbTransaction Transaction { get { return transaction; } }

         private static DbTransaction transaction;

 

      

 

 

原文地址:https://www.cnblogs.com/yja9010/p/3178818.html