一、目标
统一代码风格、命名规范,增强代码可读性和可维护性,供日常开发工作中时参考,以提高团队协作的开发效率。
二、概述
此规范为C#后台项目编码规范。
三、术语
Pascal 大小写:将标识符的首字母和后面连接的每个单词的首字母都大写。可以对三字符或更多字符的标识符使用Pascal 大小写。例如:BackColor
Camel 大小写:标识符的首字母小写,而每个后面连接的单词的首字母都大写。例如: backColor
四、注释规范
4.1、类文件注释规范
SQL |
修改创建类模板方法:
|
4.2、方法规范
所有方法必须在其定义前增加此方法注释 |
/// <summary> |
XML注释各属性说明:
标记 | 说明 | 备注 |
<c> | 提供了一种将说明中的文本标记为代码的方法 |
|
<code> | 提供了一种将多行指示为代码的方法 |
|
<example> | 可以指定使用方法或其他库成员的示例。一般情况下,这将涉及到 <code> 标记的使用。 |
|
<exception> | 对可从当前编译环境中获取的异常的引用。 |
|
<include> | 得以引用描述源代码中类型和成员的另一文件中的注释。 |
|
<list> | 用于定义表或定义列表中的标题行。 |
|
<para> | 用于诸如<summary>、<remarks> 或 <returns> 等标记内,使您得以将结构添加到文本中。 |
|
<param> | 应当用于方法声明的注释中,以描述方法的一个参数。 |
|
<paramref> | 提供了一种指示词为参数的方法。 |
|
<permission> | 得以将成员的访问记入文档。 |
|
<remarks> | 用于添加有关某个类型的信息,从而补充由 <summary> 所指定的信息。 |
|
<returns> | 应当用于方法声明的注释,以描述返回值。 |
|
<see> | 得以从文本内指定链接。 |
|
<seealso> | 对可以通过当前编译环境进行调用的成员或字段的引用。 |
|
<summary> | 应当用于描述类型或类型成员。 |
|
<value> | 得以描述属性。 |
|
4.3、属性注释
在类的属性必须以以下格式编写属性注释: |
/// <summary> |
4.4、单行注释
使用“//”用于方法内的代码注释。如代码或代码段的解释。 |
4.5、多行注释
使用“/* */”该类注释用于说明一段代码的逻辑、运算步骤、注意事项等需要详细说明的内容。 |
/* 注释 |
4.6、变量注释
|
五、命名规范
要尽量使用项目所涉及领域的术语。 采用大小写混合方式,提高命名的可读性。 |
5.1、基本约定
标识符 | 命名规则 | 示例 |
命名空间 | Pascal | namespace EADO.Police.PoliceWorkPlatForm |
类 | Pascal | public class ControlHelper |
接口 | Pascal | public interface ICommonBLL |
方法 | Pascal | public List<string> GetUserList() |
属性 | Pascal | public string Name { get; set; } |
事件 | Pascal | public event EventHandler Changed; |
私有字段 | Camel | private string fieldName; |
非私有字段 | Pascal | public string FieldName; |
枚举 | Pascal | public enum Color { Red = 0, Blue = 1 } |
参数 | Camel | public void UpdateData(string fieldName) |
局部变量 | Camel | string fieldName; |
5.2、命名空间命名
首单词以 EADO 开头,以英文点 “.” 分隔;例如:EADO.Mobile.WebApi
5.3、类和接口命名
- 类的命名:避免使用单词缩写,除非它的缩写已经广为人知。
- 接口命名:要以字母I开头。保证接口与实现名字只差一个“I”前缀。
- 泛型类型参数的命名:命名要为T或者以T开头的描述性名字。
- 对同一个项目不同命名空间中的类,命名避免重复。避免引用时冲突和混淆。
5.4、方法命名
- 第一个单词为动词。
- 方法返回一个成员变量的值,方法名要以Get+变量名命名。
- 方法返回一个bool值变量,方法以Is作为前缀。
- 获取所有模块列表:Get[模块名]List
- 通过Code(单个条件)获取模块列表:Get[模块名]ListByCode
- 通过多个条件获取模块列表:Get[模块名]ListByCondition
- 通过参数获取模块分页列表:Get[模块名]PageList
- 通过参数获取模块树形列表:Get[模块名]Tree
- 通过参数获取模块导出列表:Get[模块名]ExportList
- 通过参数获取所有下级(包含本身)列表信息:Get[模块名]SelfAllChildList
- 通过参数获取所有下级(不包含本身)列表信息:Get[模块名]AllChildList
- 通过参数获取下一级列表信息:Get[模块名]ChildList
- 通过主键获取实体信息:Get[模块名]Entity
- 通过Code(单个条件)获取实体信息:Get[模块名]EntityByCode
- 通过多个条件获取实体信息:Get[模块名]EntityByCondition
- 保存模块表单(新增、编辑):Save[模块名]Form
- 删除模块信息:Delete[模块名]
- 其他接口:[操作][模块名]
- 导入接口:Import[Excel || Word][模块名]
- 导出接口:Export[Excel || Word][模块名]
- 验证数据重复接口:IsExist[模块名][字段名]
- 异步方法以Async为后缀,若没Async后缀则默认为同步方法
- 获取表单或列表选项:Get[模块名]Option
5.5、变量命名
- 全局公共变量使用Pascal命名法。如:public int PageIndex;
- 全局私有、受保护的变量使用Camel命名法。如:private int pageIndex;
- 局部变量使用Camel命名法。如:int pageIndex;
5.6、事件
- 使用动词描述事件名称。
- 对委托定义使用Event后缀。
- 对事件定义使用EventHandler后缀。
- 用EventArgs后缀命名事件参数类。
- 动作事件使用On前缀。
5.7、集合
集合命名使用复数形式。如:userEntities
5.8、常量(const)
所有单词大写,多个单词之间使用“_”分隔。例如:
public const string API_SERVER = ""; |
六、组件命名
控件名称使用Camel命名规则 |
控件类型 | 控件缩写 | 举例 |
Button | btn | btnAdd |
CheckBox | chb | chbIsFirst |
ComboBox | cbo | cboUnit |
Label | lbl | lblName |
LinkLabel | llbl | llblToday |
TextBox | txt | txtName |
RadioButton | rdo | rdoName |
GroupBox | grp | grpName |
PictureBox | pic | picName |
Panel | pnl | pnlName |
DataGrid | dg | dgData |
ListBox | lst | lstUnit |
TabControl | tab | tabUnit |
ContextMenuStrip | cms | cmsMenu |
TextBlock | txtb | txtbName |
PassWordBox | ptxt | ptxtName |
ListView | lvw | lvwUnit |
RichTextBox | rtx | rtxContent |
ToolTip | Tip | tipName |
WebBrowser | wbs | wbsName |
TreeView | Tv | tvName |
ProgressBar | prg | prgAudio |
DateTimePicker | dtp | dtpBeginTime |
DatePicker | dp | dpTime |
Calendar | cdr | cdrDay |
Image | img | imgPic |
Canvas | cvs | cvsPnl |
Menu | mu | muMain |
Timer | Tmr | tmrTick |