C#和ASP.net命名规范

C#书写规范

一、命名

对于理解应用程序的逻辑流,命名方案是最有影响力的一种帮助。名称应该说明“什么”而不是“如何”。通过避免使用公开基础实现(它们会发生改变)的名称,可以保留简化复杂性的抽象层。例如,可以使用 GetNextStudent(),而不是 GetNextArrayElement()。

命名原则是:
选择正确名称时的困难可能表明需要进一步分析或定义项的目的。使名称足够长以便有一定的意义,并且足够短以避免冗长。唯一名称在编程上仅用于将各项区分开。表现力强的名称是为了帮助人们阅读;因此,提供人们可以理解的名称是有意义的。不过,请确保选择的名称符合适用语言的规则和标准。

以下几点是推荐的命名方法。

1、方法、属性、变量规范

  • 避免容易被主观解释的难懂的名称,如方面名 AnalyzeThis(),或者属性名 xxK8。这样的名称会导致多义性。
  • 在面向对象的语言中,在类属性的名称中包含类名是多余的,如 Book.BookTitle。而是应该使用 Book.Title。
  • 使用动词-名词的方法来命名对给定对象执行特定操作的例程,如 CalculateInvoiceTotal()。
  • 在允许函数重载的语言中,所有重载都应该执行相似的函数。
  • 只要合适,在变量名的末尾或开头加计算限定符(Avg、Sum、Min、Max、Index)。
  • 在变量名中使用互补对,如 min/max、begin/end 和 open/close。
  • 鉴于大多数名称都是通过连接若干单词构造的,请使用大小写混合的格式以简化它们的阅读。另外,为了帮助区分变量和例程,请对例程名称使用 Pascal 大小写处理 (CalculateInvoiceTotal),其中每个单词的第一个字母都是大写的。对于变量名,请使用 camel 大小写处理 (documentFormatType),其中除了第一个单词外每个单词的第一个字母都是大写的。
  • 布尔变量名应该包含 Is,这意味着 Yes/No 或 True/False 值,如 fileIsFound。
  • 在命名状态变量时,避免使用诸如 Flag 的术语。状态变量不同于布尔变量的地方是它可以具有两个以上的可能值。不是使用 documentFlag,而是使用更具描述性的名称,如 documentFormatType。 (此项只供参考)
  • 即使对于可能仅出现在几个代码行中的生存期很短的变量,仍然使用有意义的名称。仅对于短循环索引使用单字母变量名,如 i 或 j。
  • 可能的情况下,尽量不要使用原义数字或原义字符串,如 For i = 1 To 7。而是使用命名常数,如 For i = 1 To NUM_DAYS_IN_WEEK 以便于维护和理解。

二、代码书写规范

格式化使代码的逻辑结构很明显。花时间确保源代码以一致的逻辑方式进行格式化,这对于您和你的开发小组,以及以后维护源代码的其他开发人员都有很大的帮助。
以下几点是推荐的格式化方法。

  • 建立标准的缩进大小(如四个空格),并一致地使用此标准。用规定的缩进对齐代码节。

  • 在发布源代码的硬拷贝版本时使用特定的字体以及字号(新宋体、小五号)。

  • 在括号对对齐的位置垂直对齐左括号和右括号,如:

    for (i = 0; i < 100; i++)
    {
        ;
    }
    

    也可以使用倾斜样式,即左括号出现在行尾,右括号出现在行首,如:

    for (i = 0; i < 100; i++){
        ;
    }
    

    无论选择哪种样式,请在整个源代码中使用那个样式。

  • 沿逻辑结构行缩进代码。没有缩进,代码将变得难以理解,如:

    if(expression )
    {   
        //
        //此处填写你的代码块;
        //
    }
    
    if(expression )
    {   
        //
        //此处填写你的代码块;
        //
    }
    else
    {   
        //
        //此处填写你的代码块;
        //
    }
    

    缩进代码会产生出更容易阅读的代码,如:

    if(expression )
    {
        if(expression )
        { 
            //
            //此处填写你的代码块;
            //
        }
        else
        {   
            //
            //此处填写你的代码块;
            //
        }
    }
    
  • 为注释和代码建立最大的行长度,以避免不得不滚动源代码编辑器,并且可以提供整齐的硬拷贝表示形式。

  • 在大多数运算符之前和之后使用空格,这样做时不会改变代码的意图。但是,C++ 中使用的指针表示法是一个例外。

  • 使用空白为源代码提供结构线索。这样做会创建代码“段”,有助于读者理解软件的逻辑分段。

  • 当一行内容太长而必须换行时,在后面换行代码中要使用缩进格式,如下:

    string inserString = "Insert Into TableName(username,password,email,sex,address)"
    + "Values('Soholife','chenyp','soholife@sina.com','male','深圳福田')";
    
  • 只要合适,每一行上放置的语句避免超过一条。例外是 C、C++、C# 或 JScript 中的循环,如 for (i = 0; i < 100; i++)

  • 编写 HTML 时,建立标准的标记和属性格式,如所有标记都大写或所有属性都小写。另一种方法是,坚持 XHTML 规范以确保所有 HTML 文档都有效。尽管在创建 Web 页时需折中考虑文件大小,但应使用带引号的属性值和结束标记以方便维护。

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

  • 在物理文件之间在逻辑上划分源代码。

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

    SELECT FirstName, LastName
    FROM Customers
    WHERE State = 'WA'
    
  • 将大的复杂代码段分为较小的、易于理解的模块。

三、注释

软件文档以两种形式存在:外部的和内部的。外部文档(如规范、帮助文件和设计文档)在源代码的外部维护。内部文档由开发人员在开发时在源代码中编写的注释组成。
不考虑外部文档的可用性,由于硬拷贝文档可能会放错地方,源代码清单应该能够独立存在。外部文档应该由规范、设计文档、更改请求、错误历史记录和使用的编码标准组成。
内部软件文档的一个难题是确保注释的维护与更新与源代码同时进行。尽管正确注释源代码在运行时没有任何用途,但这对于必须维护特别复杂或麻烦的软件片段的开发人员来说却是无价的。

以下几点是推荐的注释方法:

  • 如果用 C# 进行开发,请使用 XML 文档格式,如下面方法的注释:

    ///
    /// 得到某人的年龄
    ///
    /// 用户名
    /// 用户年龄
    public int GetUserAge(string userName)
    {
        //
        //此处写你的程序代码
        //
    }
    
  • 修改代码时,总是使代码周围的注释保持最新。

  • 在每个例程的开始,提供标准的注释样本以指示例程的用途、假设和限制很有帮助。注释样本应该是解释它为什么存在和可以做什么的简短介绍。

  • 避免在代码行的末尾添加注释;行尾注释使代码更难阅读。不过在批注变量声明时,行尾注释是合适的;在这种情况下,将所有行尾注释在公共制表位处对齐。

  • 避免杂乱的注释,如一整行星号。而是应该使用空白将注释同代码分开。

  • 避免在块注释的周围加上印刷框。这样看起来可能很漂亮,但是难于维护。

  • 在部署之前,移除所有临时或无关的注释,以避免在日后的维护工作中产生混乱。

  • 如果需要用注释来解释复杂的代码节,请检查此代码以确定是否应该重写它。尽一切可能不注释难以理解的代码,而应该重写它。尽管一般不应该为了使代码更简单以便于人们使用而牺牲性能,但必须保持性能和可维护性之间的平衡。

  • 在编写注释时使用完整的句子。注释应该阐明代码,而不应该增加多义性。

  • 在编写代码时就注释,因为以后很可能没有时间这样做。另外,如果有机会复查已编写的代码,在今天看来很明显的东西六周以后或许就不明显了。

  • 避免多余的或不适当的注释,如幽默的不主要的备注。

  • 使用注释来解释代码的意图。它们不应作为代码的联机翻译。

  • 注释代码中不十分明显的任何内容。

  • 为了防止问题反复出现,对错误修复和解决方法代码总是使用注释,尤其是在团队环境中。

  • 对由循环和逻辑分支组成的代码使用注释。这些是帮助源代码读者的主要方面。

  • 在整个应用程序中,使用具有一致的标点和结构的统一样式来构造注释。

  • 用空白将注释同注释分隔符分开。在没有颜色提示的情况下查看注释时,这样做会使注释很明显且容易被找到。

C#程序编码规范 wirte(原作)


对该文的评论 人气:1456

shofee (2003-7-9 9:00:59)

very goog!very good!

nlock (2003-7-5 17:03:22)

规范是必须的

VingoL (2003-5-30 19:14:28)

文档规范应该成为业界的公识!!!

lmdhit (2003-5-26 22:49:03)

支持!!!有了这些规范,文档也规范了

imports (2003-5-24 11:07:25)

不错!

http://www.ai361.com/project/GP007.asp

C#编程规范-程序员们都应该这样写代码

-落叶夏日

为了保证大家使用C#编程和C++的风格的连贯,我在C++的标准备上对C#编程规则作了制定(试用版),在这里感谢大家的支持,特别是Stone Jiang.

基本要求

1程序结构要求

1.1 程序结构清晰,简单易懂,单个函数的程序行数不得超过100行。
1.2 打算干什么,要简单,直接了当,代码精简,避免垃圾程序。
1.3 尽量使用.NET库函数和公共函数(无特殊情况不要使用外部方法调用windows的核心动态链接库)。
1.4 不要随意定义全局变量,尽量使用局部变量。

2.可读性要求

2.1 可读性第一,效率第二(代码是给人读的J)。
2.2 保持注释与代码完全一致。
2.3 每个源程序文件,都有文件头说明,说明规格见规范。
2.4 每个函数,都有函数头说明,说明规格见规范。
2.5 主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。
2.6 处理过程的每个阶段都有相关注释说明。
2.7 在典型算法前都有注释, 同时算法在满足要求的情况下尽可能简单。
2.8 利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位,定义Tab为 6个字节。
2.9 循环、分支层次不要超过五层。
2.10 注释可以与语句在同一行,也可以在上行。
2.11 空行和空白字符也是一种特殊注释。
2.12 一目了然的语句不加注释。
2.13 注释的作用范围可以为:定义、引用、条件分支以及一段代码。
2.14 注释行数(不包括程序头和函数头说明部份)应占总行数的 1/5 到 1/3
2.15 常量定义(DEFINE)有相应说明。

3. 结构化要求

3.1 禁止出现两条等价的支路。
3.2 禁止GOTO语句。
3.3 用 IF 语句来强调只执行两组语句中的一组。禁止 ELSE GOTO 和 ELSE RETURN。
3.4 用 CASE 实现多路分支。
3.5 避免从循环引出多个出口。
3.6 函数只有一个出口。
3.7 不使用条件赋值语句。
3.8 避免不必要的分支。
3.9 不要轻易用条件分支去替换逻辑表达式。

4. 正确性与容错性要求

4.1 程序首先是正确,其次是优美
4.2 无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。
4.3 改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。
4.4 所有变量在调用前必须被初始化。
4.5 对所有的用户输入,必须进行合法性检查。
4.6 不要比较浮点数的相等,如: 10.0 * 0.1 == 1.0 , 不可靠
4.7 程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否逻辑锁定、打印机是否联机等,对于明确的错误,要有明确的容错代码提示用户。
4.8 单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。
4.9 尽量使用规范的容错语句. 例如:

try
{
}
catch
{
}
finally
{
}

5. 可重用性要求

5.1 重复使用的完成相对独立功能的算法或代码应抽象为asp.net服务或类。
5.2 asp.net服务或类应考虑OO思想,减少外界联系,考虑独立性或封装性。

附:C#编程规范

1适用范围

本标准适用于利用Visul C# ,其余语言作参考.。

2变量命名

命名必须具有一定的实际意义,形式为xAbcFgh,x由变量类型确定,Abc、Fgh表示连续意义字符串,如果连续意义字符串仅两个,可都大写.如OK.具体例程:

前缀类型示例
bBOOL类型bEnable;
szcharszText
sbsbytesbText
btbytebtText
nintnText
uiuintuiText
llonglText
ululongulText
ffloatfText
ddoubledText
bboolbText
dedecimaldeText
strstringstrText
x,y坐标
att表属性
m_类成员变量m_nVal, m_bFlag
s_类静态成员变量s_nVal,s_bFlag

//不提议用全局变量,其于类的实例,尽量选取表示该类特性的字母,例如classText,class体现类的特性.

3常量命名和宏定义

常量和宏定义必须具有一定的实际意义;

常量和宏定义在#include和函数定义之间;

常量和宏定义必须全部以大写字母来撰写,中间可根据意义的连续性用下划线连接,每一条定义的右侧必须有一简单的注释,说明其作用;

4资源名字定义格式(我对.NET的资源还没有了解的多),只写几个

菜单:IDM_XX或者CM_XX
位图:IDB_XX
对话框:IDD_XX
字符串:IDS_XX
DLGINIT:DIALOG_XX
ICON:IDR_XX

5函数命名和命名空间,类的命名,接口的命名

函数原型说明包括引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名, 如是内部函数,只要注释其定义文件名;第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线间隔,示例如下:

void PrintTrackData ( );
void ShowChar (int , int ,char);

事件函数的命名:

void EventH(object sd,Event e) //Event 表示事件响应的函数.

接口的命名

接口的命名一般都以’I’作为首字母,为了和类区分,例如:

interface IA

命名空间(例如 namespace A)和类的命名规则从原则上和函数命名相同.

6结构体命名

结构体类型命名必须全部用大写字母,原则上前面以下划线开始;结构体变量命名必须用大小写字母组合,第一个字母必须使用大写字母,必要时可用下划线间隔。对于私有数据区,必须注明其所属的进程。全局数据定义只需注意其用途。

示例如下:

typedef struct
{
    char szProductName[20];
    char szAuthor[20];
    char szReleaseDate[16];
    char szVersion[10]; 
    unsigned long MaxTables;
    unsigned long UsedTables;
}DBS_DATABASE;
DBS_DATABASE GdataBase;

7 控件的命名

C#控件规则为了和.net类库统一,分WindowsForm程序和Web程序(也许大家不是很习惯J).

  • WindowsForm程序

    用小写前缀表示类别

    前缀描述
    fm窗口
    cmd按钮
    cob combo下拉式列表框
    txt文本输入框
    lab labal标签
    img image图象
    pic picture
    grd Grid网格
    scr滚动条
    lst列表框
    frmfram
  • Web程序

    用大写前缀表示类别

    前缀描述
    Fm窗口
    Cmd按钮
    Cob combo下拉式列表框
    Txt文本输入框
    Lab labal标签
    Img image图象
    Pic picture
    Grd Grid网格
    Scr滚动条
    Lst列表框
    Frmfram

8注释

  • 原则上注释要求使用中文;
  • 文件开始注释内容包括:公司名称、版权、作者名称、时间、模块用途、背景介绍等,复杂的算法需要加上流程说明;
  • 函数注释包括:输入、输出、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明;
  • 程序中注释包括:修改时间和作者、方便理解的注释等;

引用一: 文件开头的注释模板

/******************************************************************
** 文件名:
** Copyright (c) 1998-1999 *********公司技术开发部
** 创建人:
** 日 期:
** 修改人:
** 日 期:
** 描 述:
**
** 版 本:
**----------------------------------------------------------------------------
******************************************************************/

引用二: 函数开头的注释模板

/*****************************************************************
** 函数名:
** 输 入: a,b,c
** a---
** b---
** c---
** 输 出: x---
** x 为 1, 表示...
** x 为 0, 表示...
** 功能描述:
** 全局变量:
** 调用模块:
** 作 者:
** 日 期:
** 修 改:
** 日 期:
** 版本
****************************************************************/

引用三: 程序中的注释模板

/*----------------------------------------------------------*/
/* 注释内容 */
/*----------------------------------------------------------*/

9 程序

a. 程序编码力求简洁,结构清晰,避免太多的分支结构及太过于技巧性的程序,尽量不采用递归模式。
b. 编写程序时,亦必须想好测试的方法,换句话说,”单元测试” 的测试方案应在程序编写时一并拟好。
c. 注释一定要与程序一致。
d. 版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。
e. 程序中每个block 的开头 ”{" 及 "}” 必须对齐,嵌套的block 每进一套,缩进一个tab,TAB 为4个空格,block类型包括if、for、while、do等关键字引出的。
f. 对于比较大的函数,每个block 和特殊的函数调用,都必须注明其功能.

Contributors: FHL