配色: 字号:
C#编码规范(1.0)
2017-06-19 | 阅:  转:  |  分享 
  
C#编码规范目录1.简介22.适用范围23.文体24.代码组织与风格34.1.Tab34.2.缩进34.3.空行34.4.函
数长度34.5.{”,“}”34.6.行宽44.7.空格45.注释55.1.注释的基本约定55.2.注释类型55.4.
程序修改注释76.命名76.1.命名的基本约定86.2.各种标示符类型的命名约定96.3.组件名称缩写列表127.声明
138.表达式和语句139.类型设计规范149.1.抽象类设计149.2.静态类设计149.3.枚举设计1510.成员
设计规范1510.1.成员设计的一般规范1510.2.方法的重载规范1510.3.属性和方法的选择1710.4.属性的设计
规范:1710.5.构造函数的设计规范1710.6.字段设计规范1811.异常处理规范1811.1.异常类型选择规范181
1.2.异常处理规范181.简介本规范为一套编写高效可靠的C#代码的标准、约定和指南。它以安全可靠的软件工程原则为基础,使
代码易于理解、维护和增强,提高生产效率。同时,将带来更大的一致性,使软件开发团队的效率明显提高。2.适用范围本规范适用于公司所有
的C#源代码,为详细设计,代码编写和代码审核提供参考和依据。3.文体本规范中的建议分为四种:要,建议,避免,不要,表示需要遵循的
级别。文档中会以粗体表示。要:描述必须遵循的规范。例如:异常类要以“Exception”做为后缀;建议:描述在一般情况下应该遵循的
规范,但如果完全理解规范背后的道理,并有很好的理由不遵循它时,也不畏惧打破常规。例如:强制类型转换时,在类型和变量之间建议加一空格
。不要:描述一些几乎绝对绝不应该违反的规范。例如:每个函数有效代码(不包括注释和空行)长度不要超过100行。避免:与建议相对,一般
情况下应该遵循,但有很好的理由时也可以打破。例如:避免块内部的变量与它外部的变量名相同。4.代码组织与风格4.1.Tab要使一
个Tab为4个空格长。4.2.缩进要使一个代码块内的代码都统一缩进一个Tab长度。4.3.空行建议适当的增加空行,来增加代码的
可读性。(1)方法之间;(2)局部变量和它后边的语句之间;(3)方法内的功能逻辑部分之间;4.4.函数长度每个函数有效代码(不包
括注释和空行)长度不要超过100行。4.5.{”,“}”开闭大括号“{”“}”要单起一行;例:if(a>=b&&c
>d){//代码}4.6.行宽每行代码和注释以小于80字符或屏幕的宽度为宜,不要写得过长。4.7.空格适当的空格使代码更加
清晰。例:(1)逗号、分号只在后面加空格。inta,b,c;(2)比较操作符,赋值操作符"="、"+=",算术操作符
"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等双目操作符的前后加空格。a=b+c;(3)"!"、
"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。flag=!isEmpty;//"!"与内容之间
i++;//"++","--"与内容之间(4)"->"、"."前后不加空格。p.id=pid;
//"."前后不加空格(5)if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显
。if(a>=b&&c>d)5.注释5.1.注释的基本约定注释的内容要清楚、简洁、明了,含义准确,防止注释二义性
。修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。建议先写注释,后写代码,注释和代码一起完成如果语句块
(比如循环和条件分枝的代码块)代码太长,嵌套太多,可使用#region和#endregion标记,加上相应的注释。5.2.注释类
型5.2.1.块注释主要用来描述文件,类等。具体格式以IDE编辑器输入“///”自动生成的格式为准,如下所列:///ary>///该类或者接口的说明///5.2.1.方法注释方法的注释规范也采用DE的注释规范,这样编译
器可以自动生成该方法的功能信息。方便开发人员使用这些方法。方法注释的代码实例如下://////该方法的功能说
明///
///方法定义参数名///name="XXXXX">方法定义参数名///方法定义参数名param>///方法定义参数名///返回值returns>5.2.2.行注释主要用在方法内部,对代码,变量,流程等进行说明。整个注释占据一行。5.2.3.尾随注释与行注
释功能相似,放在代码的同行,但是要与代码之间有足够的空间,便于分清。例:intm=4;//注释如果一个程序块内有多个尾
随注释,每个注释的缩进要保持一致。publicenumenuCommandName{UpdCrawlingTime,
//更新时间戳GetArtTitleContent,//取得文章标题和正文ConvertDocument
//文档重新转化}5.4.程序修改注释(1)删除代码行:直接删除,保持代码文件干净整洁(2)修改代码行:同时更新注释,保
持注释的正确性(3)测试代码行:前后添加注释,上线前根据情况核对代码后去掉测试代码例:名字+半角空格+fortest+
半角空格+start/end//dxwforteststart//代码行//dxwfortestend6.命名6
.1.命名的基本约定要使用可以准确说明变量/字段/类的完整的英文描述符,如firstName。对一些作用显而易见的变量可以采用简
单的命名,如在循环里的递增(减)变量就可以被命名为”i”。要采用大小写混合。不要包含下划线(“_”)。PasalCasing
:标识符的第一个单词的字母大写;camelCasing:标识符的第一个单词的字母小写。下表描述了不同类型标识符的大小写规则:标识符
大小写示例命名空间PascalnamespaceCom.Techstar.ProductionCenter类型Pascalpub
licclassDevsList接口PascalpublicinterfaceITableModel方法Pascalpub
licvoidUpdateData()属性PascalPublicintLength{…}事件Pascalpublice
ventEventHandlerChanged;私有字段CamelprivatestringfieldName;非私有字段
PascalpublicstringFieldName;枚举值PascalFileMode{Append}参数Camelpub
licvoidUpdateData(stringfieldName)局部变量CamelstringfieldName;避免
使用缩写,如果一定要使用,应保留一个标准缩写的列表,并且在使用时保持一致。避免使用长名字(最好不超过15个字母)。避免使用相似
或者仅在大小写上有区别的名字。不要用拼音要使用拼写正确的英文单词6.2.各种标示符类型的命名约定6.2.1.程序集命名公司域名
(Techstar)+项目名称+模块名称(可选)例:中心系统程序集:Techstar.ProductionCenter;中心
系统业务逻辑程序集:Techstar.ProductionCenter.Business;6.2.2.命名空间命名采用和程序集命
名相同的方式:公司域名(Techstar)+项目名称+模块名称。另外,一般情况下建议命名空间和目录结构相同。例如:中心系统
:Techstar.ProductionCenter;中心系统下的用户控件:Techstar.ProductionCenter.U
serControl;中心系统业务逻辑:Techstar.ProductionCenter.Business;中心系统数据访问:
Techstar.ProductionCenter.Data;6.2.3.类和接口命名类的名字要用名词;避免使用单词的缩写,除
非它的缩写已经广为人知,如HTTP。一些单词有大家公认的缩写。例如:temp可缩写为tmp;flag可缩写为flg
;statistic可缩写为stat;increment可缩写为inc;message可缩写为msg
;接口的名字要以字母I开头。保证对接口的标准实现名字只相差一个“I”前缀,例如对IComponent的标准实现为Componen
t;泛型类型参数的命名:命名要为T或者以T开头的描述性名字,例如:publicclassListpublicclass
MyClass对同一项目的不同命名空间中的类,命名避免重复。避免引用时的冲突和混淆;6.2.4.方法命名第
一个单词一般是动词如果方法返回一个成员变量的值,方法名一般为Get+成员变量名,如若返回的值是bool变量,一般以Is作为前缀。
如果方法修改一个成员变量的值,方法名一般为:Set+成员变量名。同上,考虑用属性来替代方法;6.2.5.变量命名按照使用范
围来分,我们代码中的变量的基本上有以下几种类型,类的公有变量;类的私有变量(受保护同公有);方法的参数变量;方法内部使用的局部变量
。不要用_或&作为第一个字母;尽量要使用短而且具有意义的单词;单字符的变量名一般只用于生命期非常短暂的变量。i,j,k,m,n一般
用于integer;c,d,e一般用于characters;s用于string(1)类的私有变量可采用加“m”前缀,例如mWor
kerName;(2)方法的参数变量采用camalString,例如workerName;(3)方法内部的局部变量;数据类型缩写
例子stringstrstrNamefloatffPricedoubleddPriceintiiNumberlongllCount
erboolblblEnabledatetimedtdtNowcharchrchrSplitbytebtbtImagesArray
arrarrBooksArrayListlstlstBooksstructstcstcMessagesenumenuenuMess
ageType6.3.组件名称缩写列表命名组件要采用匈牙利命名法,所有前缀均应遵循同一个组件名称缩写列表组件类型缩写例子Labe
lLbllblNoteTextBoxTxttxtNameButtonBtnbtnOKImageButtonIbibOKLinkBu
ttonLblbJumpHyperLinkHlhlJumpDropDownListDdlddlListCheckBoxCbcbCh
oiceCheckBoxListCblcblGroupRadioButtonRbrbChoiceRadioButtonListRb
lrblGroupImageImgimgBeautyPanelPnlpnlTreeTreeViewTvtvUnitWebComTa
bleWctwctBasicImageDateTimeInputDtidtiStartComboBoxCbcbListMyImag
eButtonMibmibOKWebComm.TreeViewTvtvUnitPageBarPbpbMaster7.声明每行要只
有一个声明,如果是声明i,j,k之类的简单变量可以放在一行;除了for循环外,声明要放在块的最开始部分。for循环中的变量声明可以
放在for语句中。如:for(inti=0;I<10;i++)。避免块内部的变量与它外部的变量名相同。8.表达式
和语句每行建议只有一条语句。if-else,if-elseif语句,任何情况下,都应该有“{”,“}”,格式如下:if(cond
ition){statements;}elseif(condition){statements;}else{statement
s;}switch语句,每个switch里都应包含default子语句,格式如下:switch(condition){case
ABC:statements;/fallsthrough/caseDEF:statements;break;case
XYZ:statements;break;default:statements;break;}try-catch语句格式如下:tr
y{statements;}catch(ExceptionClasse){statements;}finally{statem
ents;}9.类型设计规范要确保每个类型由一组定义明确,相互关联的成员组成,而不仅仅是一些无关功能的随机集合;9.1.抽象
类设计不要在抽象类中定义公有的或内部受保护的构造函数。因为抽象类无法实例化,所以这种设计会误导用户;要为抽象类定义受保护的构造函数
或内部构造函数;9.2.静态类设计静态类是一个只包含静态成员的类,它提供了一种纯面向对象设计和简单性之间的一个权衡,广泛用来提供
类似于全局变量或一些通用功能。要少用静态类。静态类应该仅用作辅助类;避免把静态类当作杂物箱。每个静态类都应该有其明确目的;9.3.
枚举设计要用枚举来加强那些表示值的集合的参数,属性以及返回值的类型性;要优先使用枚举而不是静态常量。例如://不好的写法publ
icstaticclassColor{publicstaticintRed=0;publicstaticint
Green=1;publicstaticintBlue=2;}//好的写法publicenumenuColor
{Red,Green,Blue}10.成员设计规范方法,属性,事件,构造函数以及字段等统称为成员。10.1.成员设计的一般规范
10.2.方法的重载规范避免在重载中随意的给参数命名。如果两个重载中的某个参数表示相同的输入,那么该参数的名字应该相同。例如:p
ublicclassString{//好的写法publicintIndexOf(stringvalue){...}p
ublicintIndexOf(stringvalue,intstartIndex){...}//不好的写法publ
icintIndexOf(stringvalue){...}publicintIndexOf(stringstr,
intstartIndex){...}}避免使重载成员的参数顺序不一致。在所有的重载中,同名参数应该出现在相同的位置。例
如:publicclassEventLog{publicEventLog();publicEventLog(string
logName);publicEventLog(stringlogName,stringmachineName);publ
icEventLog(stringlogName,stringmachineName,stringsource);}1
0.3.属性和方法的选择基本原则是每次返回结果是变化的,用方法,返回结果不变化可以用属性。例如来自于.netframework
的例子://好的写法Guid.NewGuid();//不好的写法DateTime.Now;10.4.属性的设计规范:如果不需要改
变属性值,要创建只读属性;不要提供只写属性;要为所有的属性提供合理的默认值,这样可以确保默认值不会导致漏洞或效率低的代码;避免在属性的获取方法抛出异常。10.5.构造函数的设计规范建议提供简单的构造函数,最好是默认构造函数。简单的构造函数增强易用性;要在构造函数中做最少的工作。任何其他处理应该推迟到需要的时候;10.6.字段设计规范不要提供公有的或受保护的字段。代之以属性来访问字段;建议只用常量字段来表示永远不会改变的量。11.异常处理规范(网站开发组先进行小规模运用)一般情况下不要使用异常实现来控制程序流程结构;使用异常而不要用错误代码来报告错误;要通过抛出异常的方式来报告操作失败。如果成员无法成功地完成它应该做的任务,那么应该抛出异常;11.2.异常处理规范不是百分之百确定的情况,不要吞掉异常;建议捕获特定类型的异常,如果理解该异常在具体环境当中产生的原因;不要捕获不应该捕获的异常,通常应该允许异常沿着调用栈传递;进行清理工作时要用try-finally,避免使用try-catch;要在捕获并重新抛出异常时使用空的throw语句,这是保持调用栈的最好方法
献花(0)
+1
(本文系图书馆煮饭...首藏)