1、命名规则

概述

编码规范对于程序而言尤为重要,有以下几个原因:

  • 一个项目的生命周期中,80%的花费在于维护;
  • 几乎没有任何一个项目,在其整个生命周期中,均由最初的开发人员来维护;
  • 命名规范可以改善项目的可读性,可以让程序员尽快而彻底地理解新的代码;
  • 如果你将源码作为产品发布,就需要确任它是否被很好的打包并且清晰无误,比如你已构建的其它任何产品。 为了执行规范,每个软件开发人员必须一致遵守编码规范。

常见规则

  • Pascal:每个单词开头的字母大写(如 TestCounter).
  • Camel:除了第一个单词外的其他单词的开头字母大写. 如. testCounter.
  • Upper:所有单词所有字母大写,单词之间用_连接,如:MAX_VALUE.

类名

  • 类名应该为名词及名词短语,尽可能使用完整的词.
  • 使用Pascal规则
  • 不要使用类前缀 - 不要使用下划线字符 _
  • 有时候需要提供以字母 I 开始的类名称,虽然该类不是接口。只要 I 是作为类名称组成部分的整个单词的第一个字母,这便是适当的。例如,类名称 IdentityStore 就是适当的。
  • 代码中所有成员禁止直接使用中文的命名方式,禁止使用中文拼音命名(一些通用的命名除外:比如城市可以采用beiJing、shangHai这样的命名规则是可以的),禁止使用中英文混合命名方式,禁止出现a、b、c、aa、ss、x、xx等毫无意义的命名方式
例如
public class DataService
{
}

接口

  • 接口名称应该为名词及名词短语或者描述其行为的形容词,尽可能使用完整的词. (Example:IComponent or IEnumberable)
  • 使用Pascal规则
  • 使用字符 I 为前缀,并紧跟一个大写字母(即接口名的第一个字母大写),此前缀可以清楚地向使用者表明这是 interface
例如
interface ICompare
{
    int Compare();
}

枚举

  • 对于 Enum 类型和值名称使用 Pascal 大小写。
  • 少用缩写。
  • 需要在 Enum 类型名称上使用 Enum 后缀,明确区分枚举类型。
例如
 public enum SexEnum
 {= 1,= 2,
     未知 = 3
 }

变量

  • 应单行定义并初始化
  • 避免 局部变量成员变量 的重名
  • 只要合适,在变量名的末尾或开头加计算限定符(Avg、Sum、Min、Max、Index)。
  • 只要合适,在变量名中使用互补对,如 min/max、begin/end 和 open/close。
  • 类中的变量声明尽量标记修饰符,为了封闭性应少开放字段属性,使用Private或者Protected进行使用,这样易于后续维护和重构。
例如
 public string Test()
 {
     var test = "test";
     var test1 = "test1";
     var test2 = "test2";
     Console.WriteLine(test);
 }

局部变量

  • 变量的声明,除了类型无法推断的情况外,应尽量使用 var
  • 在简单的循环语句中计数器变量使用 i, j, k, l, m, n
  • 使用 Camel 命名规则
例如
 public string Test()
 {
     var test = "test";
     Console.WriteLine(test);
 }

成员变量

  • 在命名 成员变量 时,使用 Camel规则,并对它们添加 _ 作为前缀。
  • 常量 使用 Upper 规则
例如
{
    public UserBusiness _userBusiness;
    private static IWorkerQueue _workerQueue;
    protected static TimeSpan _timeSpan;

    private const int MAX_COUNT = 100;
}

方法

  • 使用Pascal规则
  • 推荐名称应该为动词或动词短语.例如Save,SaveCustomer,而不要使用CustomerSave
  • 不要在方法中重复类的名称。例如,如果某个类已命名为 Book,则不要将某个方法称为 Book.CloseBook,而可以将方法命名为 Book.Close。
  • 默认情况下,所有异步方法 都必须具有 Async 后缀
  • 扩展方法: 为了区分不同的扩展类型,扩展文件的定义应 Extention.具体类型.cs,例如:对 Strig 的扩展:Extention.String.cs,该文件下只放置对 String 的扩展方法。

属性

  • 名称应该为名词及名词短语
  • 使用Pascal规则
  • 对于bool型属性或者变量使用Is(is)作为前缀,不要使用Flag后缀,例如应该使用IsDeleted,而不要使用DeleteFlag

集合

  • 名称应该为名词及名词短语
  • 使用Pascal规则
  • 名称后面追加 Collection
  • 复数类型(集合类、数组等)命名规则:优先以小写字符s结尾,如果单词最后的字母就是s或其他不适合s结尾的单词,可以使用复数类型的类型名称结尾(如List、Array等结尾)。前面规则如果都不好命名,可自行命名
例如
public class UserCollection
{
    public List<string> userNames { get; set; }
    public string[] userNameArray { get; set; }
    public List<string> userNameList { get; set; }
}

事件

  • event handlers命名使用 EventHandler 后缀.
  • 两个参数分别使用 sender 及 e
  • 使用Pascal规则
  • 事件命名使用语法时态反映其激发的状态,例如 Changed,Changing.
例如
public delegate void ClickedEventHandler(object sender, ClickedEventArgs e)
{
}

自定义特性

自定义的属性以 Attribute 结尾

例如
public class AuthorAttribute : Attribute
{
}

自定义异常

自定义的异常以 Exception 结尾

例如
public class AppException : Exception
{
}

声明顺序

成员变量--》构造函数--》属性--》方法

例如
 public class Account
 {
     public static string _bankName;
     public static decimal _reserves;

     // Constructor
     public Account()
     {
         // ...
     }

     public string Number { get; set; }
     public DateTime DateOpened { get; set; }
     public DateTime DateClosed { get; set; }
     public decimal Balance { get; set; }

     public override string ToString()
     {
         return base.ToString();
     }
 }

泛型

  • 请使用描述性名称命名泛型类型参数,除非单个字母名称完全具有自我说明性且描述性名称不会增加任何作用。
public interface ISessionChannel<TSession> { /*...*/ }
public delegate TOutput Converter<TInput, TOutput>(TInput from);
public class List<T> { /*...*/ }
  • 在类型参数描述性名称前添加前缀 "T"。
public interface ISessionChannel<TSession>
{
    TSession Session { get; }
}
  • 对具有单个字母类型参数的类型,考虑使用 T 作为类型参数名称。
public int IComparer<T>() { return 0; }
public delegate bool Predicate<T>(T item);
public struct Nullable<T> where T : struct { /*...*/ }

实体

  • 数据库实体: 数据库表对应实体应该以Db_开头后面跟Pascal命名,例如用户实体
[SugarTable("base_user")]
public class Db_User : Db_Base_HospitalId
{
}
  • DTO(Data Transfer Object): 前端给后端传递的数据
  • VO(view object): 后端给前端传递的数据,可视层对象,用于给前端显示的对象。(只传递有需要的参数以保障数据安全)
  • PO(Persistent Object): 数据库表结构到程序的映射类,持久化对象,是一种 o/r 映射关系,可以看成是数据库表到实体对象的映射。
  • 命名规则:大驼峰命名法+DTO/VO/PO等
public class UserInfoDTO { }
public class UserInfoVO { }
public class UserInfoPO { }

各层命名

  • Controller 层的业务类以 Controller 结尾
  • 业务层数据层 名命名规则:业务层类库名称命名规则:以 Service/Business 结尾、数据层类库命名规则:以 Repository 结尾
  • 获取数据的方法以Get开头(加上要获取的对象名)。如获取单个对象,可以使用Get()、GetUserInfo()。获取复数对象(集合类),可以使用Gets()、GetUserInfos()。
  • 新增数据的方法以Insert开头(加上要获取的对象名)。如往数据库中新增一条记录,方法命名为Insert()、InsertUserInfo()。往数据库中新增多条记录,方法命名为Inserts()、InsertUserInfos()。
  • 删除数据的方法以Delete/Remove(加上要删除的对象名)。如删除数据库中的一条记录,方法命名为Delete()、DeleteUserInfo()。删除数据库中的多条记录,方法命名为Deletes()、DeleteUserInfos()。
  • 修改数据的方法以Update开头(加上要修改的对象名)。如修改一条数据信息,方法命名为Update()、UpdateUserInfo()。修改多条数据的信息,方法命名为Updates()、UpdateUserInfos()。

控件命名规则

命名方法

控件名简写+英文描述,英文描述首字母大写

主要控件名简写对照表

  • 控件名 => 简写
  • Label => lbl
  • TextBox => txt
  • Button => btn
  • LinkButton => lnkbtn
  • ImageButton => imgbtn
  • DropDownList => ddl
  • ListBox => lst
  • DataGrid => dg
  • DataList => dl
  • CheckBox => chk
  • CheckBoxList => chkls
  • RadioButton => rdo
  • RadioButtonList => rdolt
  • Image => img
  • Panel => pnl
  • Calender => cld
  • AdRotator => ar
  • Table => tbl
  • RequiredFieldValidator => rfv
  • CompareValidator => cv
  • RangeValidator => rv
  • RegularExpressionValidator => rev
  • ValidatorSummary => vs
  • CrystalReportViewer => rptvew
Last Updated:
Contributors: heyuan