1、4.7.2.14 控件命名 184.7.2.15 大写风格 234.8 开发习惯 234.8.1 可见性 234.8.2 不要硬编码数字 234.9 代码示例 244.9.1 作用域(“”)示例 245 参考 256 附录 256.1 XML注释标记的使用 257 修改历史 281 目标为重庆思恩科信息技术有限责任公司的技术部制定一个统一的编码规范,最大限度减少不同程序员开发的代码间的差异。2 概述 为了使应用程序的结构和编码风格标准化,便于阅读和理解编码,以提高开发效率和产品的标准化,制订一套开发规范和标准势在必行。此外,好的编码约定可使源代码严谨、可读性强且意义清楚,与其它语言约定相一致,
2、并且尽可能的直观。希望开发人员严格遵守此套开发规范和标准,并落实到自己的程序中。本规范主要针对.NET程序员,但是其中许多规则同时适用于其他语言的程序员。3 总体要求程序结构化 程序结构清晰,函数功能简单易懂(单个函数的代码行数不超过100行)代码可读性 保持注释与代码完全一致 每个源程序文件,都有文件头说明,详细见下节 每个函数,都有函数头说明,详细见下节 主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义 处理过程的每个阶段都有相关注释说明 在典型算法前都有注释, 同时算法在满足要求的情况下尽可能简单 利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位,定义Tab为 4
3、个字节 循环、分支层次一般不应超过五层 代码简单的分支应该写在前面 不允许同行出现两个语句 空行和空白字符也是一种特殊注释 一目了然的语句不加注释 注释的作用范围可以为:定义、引用、条件分支以及一段代码 常量定义(DEFINE)有相应说明代码结构化 禁止GOTO语句 用 CASE 实现多路分支 避免不必要的分支 用 IF 语句来强调只执行两组语句中的一组。尽量不使用 ELSE RETURN 尽量避免从循环引出多个出口正确性与容错性 所有变量在调用前必须被初始化 不要比较浮点数的相等,如: 10.0 * 0.1 = 1.0 , 不可靠 访问外部资源(数据库,外部文件)时使用规范的容错语句例如:t
4、rycatchfinally4 编码规范文件结构C# 文件尽量不要让你的类或者文件太长,一般不应超过2000行代码。请按照功能划分你的代码,使结构保持清晰。一般情况下,一个文件应当只有一个类,并且文件名应该与类名保持一致。 目录结构应该为每个名称空间(namespace)建立一个目录(例如,我们可以为名称空间MyProject.TestSuite.TestTier建立这样的目录:MyProject/TestSuite/TestTier)。这样做可以让你很快定位到指定名称空间下的类文件。示例如图:缩进换行如果表达式太长而一行无法写下时,请按照下列规范进行换行: 可以在逗号后面进行换行 可以在操作
5、符号后进行换行 尽量选择在较高层处进行换行 换行后的新行应当与前一行中同级别的运算符对齐 例子:方法调用换行:longMethodCall(expr1, expr2,expr3, expr4, expr5);算术表达式换行:规范的:var = a * b / (c - g + f) +4 * z;不规范的:var = a * b / (c - g +f) + 4 * z;上面第一个表达式的换行方式是符合规范的,它换行在括号外面(较高层)。另外请注意,换行后的新行应使用tab和空格保持与前一行的同级运算符对齐,例如: var = a * b / (c - g + f) + .4 * z;表示Ta
6、b符, .表示空格。你可以设置你的编辑环境,使Tab和空格在编辑时是可见的,这是一个不错的习惯。空格我们选择Tab缩进作为缩进时采用的标准。请不要使用空格代替Tab键!注释 模块注释在一个程序模块的开始,应用注释说明模块的名字、功能、开发者和日期和版本变更历史,如下所示:/* * Copyright(c) Suzsoft DotNet Group * Description : Tenant access class * CreateDate : 2006-06-02 05:03:46 * Creater : Johnson Cao * LastChangeDate: * LastChange
7、r : * Version Info : 1.0 * */ 单行注释程序员应当在算法比较复杂的表达式前、特殊含义的变量前或者在一整段功能代码开始之前添加适当的注释。我们要求这样的单行 注释采用”/”符号,例如:/ Calculate subTotalDecimal subTotal = 0;类注释在定义一个类之前,应用“/”注释说明类的功能、使用方法和特殊的属性,如下所示:/ / This class.remarks/ Please note /remarks/summary详细的xml注释标记的使用请参见附录。方法注释在定义类成员方法前,应说明该过程/函数的名字、功能、输入/输出和版本变更历
8、史,如下所示:/ This method .param name=param1this is a param of the method SomeMethod.retvaluea return object/-/ Change History:/ Date Who Changes Made/ 2000-5-1 Author1 Initial creation/ 2000-5-15 Author2 Add some codepublic object SomeMethod(object param1)声明 单行声明变量数我们推荐每行只声明一个变量,因为这样你可以在声明后面写上该变量的注释,例如:
9、int level; / indentation levelint size; / size of table请不要在同一行声明不同含义的变量,比如:int a, b; /What is a? What does b stand for?上面的例子同样可以说明了没有意义的变量名称会让人很难理解,因此,在定义变量的时候,我们一定要给它们一个有含义的名字。 初始化最好在一定义后就初始化变量,例如:string name = strObject.Name;or int val = time.Hours;注意:如果你想要初始化对话框变量,建议使用using 声明方式例如:using (OpenFile
10、Dialog openFileDialog = new OpenFileDialog() .类和接口声明在声明类和接口的时候应当遵照下列规范: 方法名称和放置参数的括号”(”之间不应该有空格 类名声明之后应另起一行写作用域开始符” 作用域结束符”应当单独占一行,并与对应的开始符”处在同一缩进位置上 示例:Class MySample : MyClass, IMyInterface int myInt; public MySample(int myInt) this.myInt = myInt ; void Inc() +myInt; void EmptyMethod()功能语句简单逻辑每一行代
11、码应当只实现一个逻辑 if-else语句if-else应该按照这种格式书写:if(condition) DoSomething(); else DoSomethingOther();For / Foreach 语句For循环语句格式:for(int i = 0; i 5; +i) 或者,如果循环只有一个简单执行语句的话:for (initialization; condition; update) ;foreach循环格式:foreach(int i in IntList) 即使循环中只有一句执行语句,我们也要求使用” While/do-while 语句While循环格式:while (con
12、dition) 对于空循环可以这样写:while (condition) ;do-while循环格式:do while(condition);Switch 语句switch格式:switch (condition) case A:break;case B:default:Try-catch 语句try-catch格式:try catch (Exception) 或者:catch (Exception e) finally 空白空白行空白行有增强可读性的作用。它们隔离了逻辑上相互独立的模块。 在下列情况中我们还可以使用双空白行: 源文件中的两个独立的逻辑片断之间 类和接口之间(但一般情况下我们还
13、是建议一个文件一个类或接口) 下列情况中我们可以使用单空白行: 方法之间 属性之间 方法内局部变量第一出声明前 方法内相对独立的逻辑之间 注意,尽量保持空白行和其他行具有同样的缩进,可以使今后插入代码能够保持相同的缩进。参数条件之间的空白通过这些空白,可以使代码更容易被阅读,例如:TestMethod(a, b, c);而不应该这样: TestMethod(a,b,c)但是也不应有过多的空格,比如:TestMethod( a, b, c );操作符和变量或数字之间应该有空格:a = b; / dont use a=b;for (int i = 0; 10;/ dont use for (int
14、 i=0; i10; +i)/ or/ for(int i=0;i+i)表格式的样式连续的多行付值语句可以这样子写:string strName = Mr. Ed;int nValue = 5;Test aTest = Test.TestYou;利用空格对齐所有的“=”,使代码块看起来像表格一样。命名规范大写4.1.1.1 Pascal 风格变量的首字母大写,如:Name4.1.1.2 骆驼规则标识符的首字母小写,而每个后面连接的单词的首字母都大写,如:testName。4.1.1.3 大写风格只在少于两个字母的缩写中使用大写。三个以上字母的缩写都应该使用PASCAL风格。4.1.1.4 缩写
15、为了避免混淆和保证跨语言交互操作,请遵循有关使用缩写的规则: 不要将缩写或缩略形式用作标识符名称的组成部分。例如,使用GetWindow,而不要使用GetWin。 不要使用计算机领域中未被普遍接受的缩写。 在适当的时候,使用众所周知的缩写替换冗长的词组名称。例如,用UI作为User Interface的缩写,用OLAP作为On-line Analytical Processing的缩写。 在使用缩写时,对于超过两个字符长度的缩写,请使用Pascal大小写或骆驼大小写。例如,使用HtmlButton或htmlButton.。但是,应当大写仅有两个字符的缩写,如,System.IO,而不是Syst
16、em.Io. 不要在标识符或参数名称中使用缩写。如果必须使用缩写,对于由多于两个字符所组成的缩写请使用骆驼大小写,虽然这和单词的标准缩写相冲突。4.1.1.5 措词避免使用与常用的.NET Framework命名空间重复的类名称。例如,不要将以下任何名称用作类名称:System、Collections、Forms或UI。有关.NET Framework命名空间的列表,请参加类库。另外,避免使用和以下关键字冲突的标识符。AddHandlerAddressOfAliasAndAnsiAsAssemblyAutoBaseBooleanByRefByteByValCallCaseCatchCBoolC
17、ByteCCharCDateCdecCDdlCharCIntClassCLngCObjConstCShortCSngCStrCTypeDateDecimalDeclareDefaultDelegateDimDoDoubleEachElseElseIfEndEnumEraseErrorEventExitExternalSourceFalseFinalizeFinallyFloatForFriendFunctionGetGetTypeGotoHandlesIfImpementsImportsInInheritsIntegerInterfaceIsLetLibLikeLongLoopMeModMod
18、uleMustInheritMustOverrideMyBaseMyClassNamespaceNewNextNotNothingNotInheritableNotOverridableObjectOnOptionOptionalOrOverloadsOverridableOverridesParamArrayPreservePrivatePropertyProtectedPublicRaiseEventReadOnlyReDimRegionREMRemoveHandlerResumeReturnSelectSetShadowsSharedShortSingleStaticStepStopSt
19、ringStructureSubSyncLockThenThrowToTrueTryTypeOfUnicodeUntilvolatileWhenWhileWithWithEventsWriteOnlyXorevalextendsInstanceofpackagevar4.1.1.6 避免类型名称混淆不同的编程语言使用不同的术语标识基本托管类型。类库设计人员必须避免使用语言特定的术语。请遵循本节中描述的规则以避免类型名称混淆。使用描述类型的含义的名称,而不是描述类型的名称。如果参数除了其类型之外没有任何语义含义,那么在这种罕见的情况下请使用一般性名称。例如支持将各种数据类型写入到流中的类可以有以
20、下方法。void Write(double value);void Write(float value);void Write(long value);void Write(int value);void Write(short value);不要创建语义特定的方法名称,如下面的示例所示。void Write(double doublevalue);void Write(float floatvalue);void Write(long longvalue);void Write(int intvalue);void Write(short shortvalue);命名方法通常我们采用匈牙利命
21、名法来为变量命名。匈牙利命名法通常采用变量类型的缩写作为前缀,变量含义的全拼作为后缀的方法来命名变量。这种命名方法被广泛的采用在windows程序开发中,它因由一匈牙利程序员创立而得名。好的变量命名不是突出其类型,而是突出其含义。对于UI控件,我们强制要求缩写前缀,例如:System.Windows.Forms.Button btnCancel;System.Windows.Forms.TextBox txtName;4.1.1.7 页面命名采用动宾短语的形式。体现该页面要处理什么功能,如:AddUser.aspx。页面的命名规范不要和.net框架的关键字冲突,如:Login.aspx, Lo
22、gin.cs如下:public partial class Login : System.Web.UI.Page protected void Page_Load(object sender, EventArgs e) 此时的Login.cs的类Login就会和.net框架自带类冲突,必须重新命名:SysLogin4.1.1.8 命名空间命名命名命名空间时的一般性规则是使用公司名称,后跟技术名称和可选的功能与技术,如下图所示。CompanyName.TechnologyName.Feature.DesignMicrosoft.MediaMicrosoft.Media.Design给命名空间名称
23、加上公司名称或者其他知名商标的前缀可以避免两个已经发布的命名空间名称相同的可能性。例如,Microsoft.Office是由Microsoft提供的Office Automation Classes的一个适当的前缀。 这只是一个原则。第三方公司可以选择其它的名字。 避免用公司名称或其它著名品牌的名称作为名称空间的前缀,这样会造成两个公布的名称空间有同一个名称的可能性。 例如: 将微软提供的Office自动类命名为Microsoft.Office 使用Pascal大写方式,用逗号分隔逻辑成分。Microsoft.Office.PowerPoint 如果你的品牌使用的是非传统大写方式,那么一定要遵循你的品牌所确定使用的大写方式,即使这种方式背离了通常的名称空间大写规则。NeXT.WebObjects ee.cummings4.1.1.9 类命名 使用名词或名词短语命名类。 使用Pascal风格. 谨慎使用缩写命名类。. 不要使用任何类前缀(如C).4.1.1.10 接口命名 使用名词或名词短语命名接口.(例如 IComponent 或 IEnumberable) 使用Pascal风格 使用大写的I作为首字母,表示为接口 4.1.1.11 枚举命名 不使用前缀
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1