C# 编码规范、命名规则
1 规范目的 ……………………………………………………… 3
2 适用范围 ……………………………………………………… 3
3 代码注释 ……………………………………………………… 3
3.1 代码注释约定............................................ 3
3.2 模块头部注释规范...................................... 3
3.3 方法注释规范............................................. 4
3.4 代码行注释规范.......................................... 6
3.5 变量注释规范............................................. 7
4 命名规则 ……………………………………………………… 8
4.1 命名的基本约定.......................................... 8
4.2 各种标示符类型的基本约定......................... 9
4.3 组件名称缩写列表....................................... 10
5 其它规范 ……………………………………………………… 11
5.1 编程风格.................................................. 11
5.2 资源释放.................................................. 13
5.3 错误处理.................................................. 13
5.4 其它......................................................... 14
1 规范目的
- 一个软件的生命周期中,80%的花费在于维护;
- 几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护;
- 编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码。为了执行规范,每个软件开发人员必须一致遵守编码规范;
- 使用统一编码规范的主要原因,是使应用程序的结构和编码风格标准化,以便于阅读和理解这段代码;
- 好的编码约定可使源代码严谨、可读性强且意义清楚,与其它语言约定相一致,并且尽可能的直观。
2 适用范围
- 本规范主要以C#为开发语言的规范,为鲍亮实验室的原则性规范;
- 由于本规范是为撰写程序而设计,所以适用于一切有关程序撰写的工作事项。对于具体的每个项目,可能需要对之进行裁剪和补存。
- 适用人员:软件工程专业的学生;
- 适用产品:以C#编写的程序。
3 代码注释
3.1 代码注释约定
- 所有的方法和函数都应该以描述这段代码的功能的一段简明注释开始(方法是干什么)。这种描述不应该包括执行过程细节(它是怎么做的),因为这常常是随时间而变的,而且这种描述会导致不必要的注释维护工作,甚至更糟—成为错误的注释。代码本身和必要的嵌入注释将描述实现方法。
- 当参数的功能不明显且当过程希望参数在一个特定的范围内时,也应描述传递给过程的参数。被过程改变的函数返回值和全局变量,特别是通过引用参数的那些,也必须在每个过程的起始处描述它们。
3.2 模块头部注释规范
以一个物理文件为单元的都需要有模块头部注释规范,例如:C#中的.cs文件
用于每个模块开头的说明,主要包括:(粗体字为必需部分,其余为可选部分)
- 文件名称(File Name): 此文件的名称
- 功能描述(Description): 此模块的功能描述与大概流程说明
- 数据表(Tables): 所用到的数据表,视图,存储过程的说明,如关系比较复杂,则应说明哪些是可擦写的,哪些表为只读的。
- 作者(Author):
- 日期(Create Date):
- 参考文档(Reference)(可选): 该档所对应的分析文档,设计文檔。
- 引用(Using) (可选)﹕ 开发的系统中引用其它系统的Dll、对象时,要列出其对应的出处,是否与系统有关﹙不清楚的可以不写﹚,以方便制作安装档。
- 修改记录(Revision History):若档案的所有者改变,则需要有修改人员的名字、修改日期及修改理由。
- 分割符:*************************** (前后都要)
示例如下:
3.3 方法注释规范
1> C# 提供一种机制,使程序员可以使用含有XML 文本的特殊注释语法为他们的代码编写文档。在源代码文件中,具有某种格式的注释可用于指导某个工具根据这些注释和它们后面的源代码元素生成XML。具体应用当中,类、接口、属性、方法必须有<Summary>节,另外方法如果有参数及返回值,则必须有<Param>及<Returns>节。示例如下:
/// <summary>
/// …
/// </summary>
/// <param name=””></param>
/// <returns></returns>
2> 事件不需要头注解,但包含复杂处理时(如:循环/数据库操作/复杂逻辑等),应分割成单一处理函数,事件再调用函数。
3> 所有的方法必须在其定义前增加方法注释。
4> 方法注释采用 /// 形式自动产生XML标签格式的注释。
示例图如下:
5> 在公用类库中的公用方法需要在一般方法的注释后添加作者、日期及修改记录信息,统一采用XML标签的格式加注,标签如下:
<Author>作者</Author>
<CreateDate>建立日期</CreateDate>
<RevisionHistory> --修改记录
<ModifyBy>修改作者</ModifyBy>
<ModifyDate>修改日期</ModifyDate>
<ModifyReason>修改理由</ModifyReason> <ModifyBy>修改作者</ModifyBy>
<ModifyDate>修改日期</ModifyDate>
<ModifyReason>修改理由</ModifyReason> <ModifyBy>修改作者</ModifyBy>
<ModifyDate>修改日期</ModifyDate>
<ModifyReason>修改理由</ModifyReason>
</RevisionHistory>
<LastModifyDate>最后修改日期</LastModifyDate>
6> 一个代码文件如果是由一人编写,则此代码文件中的方法无需作者信息,非代码文件作者在此文件中添加方法时必须要添加作者、日期等注释。
7> 修改任何方法,必须要添加修改记录的注释。
3.4 代码行注释规范
1> 如果处理某一个功能需要很多行代码实现,并且有很多逻辑结构块,类似此种代码应该在代码开始前添加注释,说明此块代码的处理思路及注意事项等
2> 注释从新行增加,与代码开始处左对齐
3> 双斜线与注释之间以空格分开,示例图如下所示:
3.5 变量注释规范
1> 定义变量时需添加变量注释,用以说明变量的用途。
2> Class级变量应以采用 /// 形式自动产生XML标签格式的注释,示例图如下所示:
3> 方法级的变量注释可以放在变量声明语句的后面,与前后行变量声明的注释左对齐,注释与代码间以Tab隔开。
4 命名规则
4.1 命名的基本约定
1> 要使用可以准确说明变量/字段/类的完整的英文描述符,如firstName。对一些作用显而易见的变量可以采用简单的命名,如在循环里的递增(减)变量就可以被命名为 “i”。
2> 要尽量采用项目所涉及领域的术语。
3> 要采用大小写混合,提高名字的可读性。为区分一个标识符中的多个单词,把标识符中的每个单词的首字母大写。不采用下划线作分隔字符的写法。
有两种适合的书写方法,适应于不同类型的标识符:
PasalCasing:标识符的第一个单词的字母大写;
camelCasing:标识符的第一个单词的字母小写。
4> 下表描述了不同类型标识符的大小写规则:
5> 避免使用缩写,如果一定要使用,就谨慎使用。同时,应该保留一个标准缩写的列表,并且在使用时保持一致。
6> 对常见缩略词,两个字母的缩写要采用统一大小写的方式(示例:ioStream, getIOStream);多字母缩写采用首字母大写,其他字母小写的方式(示例:getHtmlTag);
7> 避免使用长名字(最好不超过 15 个字母)。
8> 避免使用相似或者仅在大小写上有区别的名字。
4.2 各种标示符类型的命名约定
1> 程序集命名
实验室名称(Lab)+ 项目名称 + 模块名称(可选),例如:
中心服务器程序集:Lab.SeverCenter;
中心服务器业务逻辑程序集:Lab.SeverCenter.Business;
2> 命名空间命名
采用和程序集命名相同的方式:实验室名称(Lab)+ 项目名称 + 模块名称。 另外,一般情况下建议命名空间和目录结构相同。例如:
中心服务器:Lab.SeverCenter;
中心服务器下的用户控件:Lab.SeverCenter.UserControl;
中心服务器业务逻辑:Lab.SeverCenter.Business;
中心服务器数据访问:Lab.SeverCenter.Data;
3> 程序集和DLL
l 大多数情况下,程序集包含全部或部分可重用库,且它包含在单个动态链接库(DLL) 中。
l 一个程序集可拆分到多个DLL 中,但这非常少见,在此准则中也没有说明。
l 程序集和DLL 是库的物理组织,而命名空间是逻辑组织,其构成应与程序集的组织无关。
l 命名空间可以且经常跨越多个程序集。可以考虑如下模式命名DLL:
<Company>.<Component>.dll
例:Lab.SeverCenter.dll
4> 类和接口命名
l 类的名字要用名词;
l 避免使用单词的缩写,除非它的缩写已经广为人知,如HTTP。
l 接口的名字要以字母I开头。保证对接口的标准实现名字只相差一个“I”前缀,例如对IComponent接口的标准实现为Component;
l 泛型类型参数的命名:命名要为T或者以T开头的描述性名字,例如:
public class List<T>
public class MyClass<Tsession>
l 对同一项目的不同命名空间中的类,命名避免重复。避免引用时的冲突和混淆;
5> 方法命名
l 第一个单词一般是动词;
l 如果方法返回一个成员变量的值,方法名一般为Get+成员变量名,如若返回的值 是bool变量,一般以Is作为前缀。另外,如果必要,考虑用属性来替代方法;
l 如果方法修改一个成员变量的值,方法名一般为:Set + 成员变量名。同上,考虑 用属性来替代方法。
6> 变量命名
l 按照使用范围来分,我们代码中的变量的基本上有以下几种类型,类的公有变量;类的私有变量(受保护同公有);方法的参数变量;方法内部使用的局部变量。这些变量的命名规则基本相同,见标识符大小写对照表。区别如下:
a) 类的公有变量按通常的方式命名,无特殊要求;
b) 类的私有变量采用两种方式均可:采用加“m”前缀,例如mWorkerName;
c) 方法的参数变量采用camalString,例如workerName;
l 方法内部的局部变量采用camalString,例如workerName。
l 不要用_或&作为第一个字母;
l 尽量要使用短而且具有意义的单词;
l 单字符的变量名一般只用于生命期非常短暂的变量:i,j,k,m,n一般用于integer;c,d,e 一般用于characters;s用于string
l 如果变量是集合,则变量名要用复数。例如表格的行数,命名应为:RowsCount;
l 命名组件要采用匈牙利命名法,所有前缀均应遵循同一个组件名称缩写列表
4.3 组件名称缩写列表
缩写的基本原则是取组件类名各单词的第一个字母,如果只有一个单词,则去掉其中的元音,留下辅音。缩写全部为小写。
5 其它规范
5.1 编程风格
1> 变量声明:
为了保持更好的阅读习惯,请不要把多个变量声明写在一行中,即一行只声明一个变量。
--例如:
String strTest1, strTest2;
--应写成:
String strTest1;
String strTest2;
2> 代码缩进:
l 一致的代码缩进风格,有利于代码的结构层次的表达,使代码更容易阅读和传阅;
l 代码缩进使用Tab键实现,最好不要使用空格,为保证在不同机器上使代码缩进保持一致,特此规定C#的Tab键宽度为4个字符,设定界面如下(工具–选项):
l 避免方法中有超过5个参数的情况,一般以2,3个为宜。如果超过了,则应使用struct来传递多个参数。
l 为了更容易阅读,代码行请不要太长,最好的宽度是屏幕宽度(根据不同的显示分辩率其可见宽度也不同)。请不要超过您正在使用的屏幕宽度。(每行代码不要超过80个字符。)
l 程序中不应使用goto语句。
l 在switch语句中总是要default子句来显示信息。
l 方法参数多于8个时采用结构体或类方式传递
l 操作符/运算符左右空一个半角空格
l 所有块的{}号分别放置一行,并嵌套对齐,不要放在同一行上
3> 空白:
l 空行将逻辑相关的代码段分隔开,以提高可读性。
l 下列情况应该总是使用两个空行:
a) 一个源文件的两个片段(section)之间。
b) 类声明和接口声明之间。
l 下列情况应该总是使用一个空行:
a) 两个方法之间。
b) 方法内的局部变量和方法的第一条语句之间。
c) 块注释(参见"5.1.1")或单行注释(参见"5.1.2")之前。
d) 一个方法内的两个逻辑段之间,用以提高可读性。
l 下列情况应该总是使用空格:
a) 空白应该位于参数列表中逗号的后面,如:
void UpdateData(int a, int b)
b) 所有的二元运算符,除了".",应该使用空格将之与操作数分开。一元操作符和操作数之间不因该加空格,比如:负号("-")、自增("++")和自减("--")。例如:
a += c + d;
d++;
c) for 语句中的表达式应该被空格分开,例如:
for (expr1; expr2; expr3)
d) 强制转型后应该跟一个空格,例如:
char c;
int a = 1;
c = (char) a;
5.2 资源释放
所有外部资源都必须显式释放。例如:数据库连接对象、IO对象等。
5.3 错误处理
1> 不要“捕捉了异常却什么也不做“。如果隐藏了一个异常,你将永远不知道异常到底发生了没有。
2> 发生异常时,给出友好的消息给用户,但要精确记录错误的所有可能细节,包括发生的时间,和相关方法,类名等。
3> 只捕捉特定的异常,而不是一般的异常。
正确做法:
错误做法:
5.4 其它
1> 一个方法只完成一个任务。不要把多个任务组合到一个方法中,即使那些任务非常小。
2> 使用C#的特有类型,而不是System命名空间中定义的别名类型。
3> 别在程序中使用固定数值,用常量代替。
4> 避免使用很多成员变量。声明局部变量,并传递给方法。不要在方法间共享成员变量。如果在几个方法间共享一个成员变量,那就很难知道是哪个方法在什么时候修改了它的值。
5> 别把成员变量声明为 public 或 protected。都声明为 private 而使用 public/protected 的属性
6> 不在代码中使用具体的路径和驱动器名。 使用相对路径,并使路径可编程。
7> 应用程序启动时作些“自检”并确保所需文件和附件在指定的位置。必要时检查数据库连接。出现任何问题给用户一个友好的提示。
8> 如果需要的配置文件找不到,应用程序需能自己创建使用默认值的一份。
9> 如果在配置文件中发现错误值,应用程序要抛出错误,给出提示消息告诉用户正确值。
10> DataColumn取其列时要用字段名,不要用索引号。
例: 正确DataColumn[“Name”]
不好 DataColumn[0]
11> 在一个类中,字段定义全部统一放在class的头部、所有方法或属性的前面。
12> 在一个类中,所有的属性全部定义在一个属性块中:
C# 编码规范、命名规则的更多相关文章
- 权威发布:长链非编码RNA命名规则
转自:http://blog.sina.com.cn/s/blog_8088f3700101pab7.html 权威发布:长链非编码RNA命名规则 对于人类基因命名标准的制定而言,雨果基因命名委员会( ...
- C语言编程规范—命名规则
C是一门朴素的语言,你使用的命名也应该这样.与Modula-2和Pascal程序员不同,C程序员不使用诸如“ThisVariableIsATemporaryCounter”这样“聪明”的名字.C程序员 ...
- java入门---基础语法&基础常识&编码规范&命名规范
一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对 ...
- 3GPP规范命名规则解读
http://blog.sina.com.cn/s/blog_6b10255301012co6.html 学习了解电信技术知识的一个很好的手段是阅读3GPP的规范.但是3GPP有大量的规范,我们可能经 ...
- CSS规范 - 命名规则
使用类选择器,放弃ID选择器 ID在一个页面中的唯一性导致了如果以ID为选择器来写CSS,就无法重用. NEC特殊字符:"-"连字符 "-"在本规范中并不表示连 ...
- CSS规范 - 命名规则--(来自网易)
使用类选择器,放弃ID选择器 ID在一个页面中的唯一性导致了如果以ID为选择器来写CSS,就无法重用. NEC特殊字符:"-"连字符 "-"在本规范中并不表示连 ...
- CSS 规范 命名规则
http://nec.netease.com/standard/css-practice.html
- hdwiki 编码规范
编码规范 命名规范 1.1.主要的目录 control 里面是控制类 ,前台命名为something.php,则后台对应的是admin_+前台名称,名称应选有意义的英文单词,例如 前台 ...
- JAVA_SE基础——编码规范&代码编写规则
这次我来给大家说明下编码规范&代码编写规则 ↓ 编码规范可以帮助程序员在编程时注意一些细节问题,提高程序的可读性,让程序员能够尽快地理解新的代码,并帮助大家编写出规范的利于维护的Java代码 ...
随机推荐
- matplotlib 雷达图2
说明 搞了一个最新版本的雷达图,比以前那个美观. 不多说,代码奉上: 完整代码 ''' matplotlib雷达图 ''' import numpy as np import matplotlib.p ...
- libgdx学习记录25——Rectangle与Circle是否重叠
Rect与Circle重叠有三种情况: 1. Rect至少有一个角在Circle里面 2. Circle与Rect的左边或右边相交,或者Circle在Rect内 3. Circle与Rect的顶边或底 ...
- 使用 idea 的Bookmarks(书签)功能
https://blog.csdn.net/qq_36376059/article/details/80277767
- [LOJ#2878]. 「JOISC 2014 Day2」邮戳拉力赛[括号序列dp]
题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没 ...
- 大话Java中的哈希(hash)结构(一)
o( ̄▽ ̄)d 小伙伴们在上网或者搞程序设计的时候,总是会听到关于“哈希(hash)”的一些东西.比如哈希算法.哈希表等等的名词,那么什么是hash呢? 一.相关概念 1.hash算法:一类特殊的算法 ...
- 借助第八代智能英特尔® 酷睿™ i7 处理器和 Unreal Swarm* 的强大性能快速构建光照
<虚幻竞技场>.<Robo Recall>等游戏的成功与 Unreal Engine 如何处理照明密切相关.原因之一就是静态光映射,但是这需要付出一定的代价:构建照明需要时间, ...
- Unity利用SMSSDK实现短信验证码(附代码)
最近一直在研究如何给app更多实用性的功能,在app进行登录或者注册时,为了方便用户更加快捷的完成登录功能,所以就决定采用短信验证码的方式进行验证登录.在学习的过程中,先使用了Mob的短信服务进行短信 ...
- 基于tensorflow2.0 使用tf.keras实现Fashion MNIST
本次使用的是2.0测试版,正式版估计会很快就上线了 tf2好像更新了蛮多东西 虽然教程不多 还是找了个试试 的确简单不少,但是还是比较喜欢现在这种写法 老样子先导入库 import tensorflo ...
- BugPhobia沟通篇章:Solr模式配置与数据导入调研
0x01 :Scrum Meeting特别说明 特别说明,考虑到编译原理课程考核的时间安排,每天开发时间急剧缩短以至于难以维系正常的Scrum Meeting,因此,将2015/12/13 00:00 ...
- 2-Nineteenth Scrum Meeting-20151219
任务安排 成员 今日完成 明日任务 闫昊 写完学习进度记录的数据库操作 请假(数据库) 唐彬 和服务器老师交流讨论区后台接口 请假(数据库) 史烨轩 尝试使用downloadmanager对noti ...