已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Net编程规范第一章 概述1.1什么是编程规范所谓编程规范即是千百万有经验的程序员经历长期教训后,极少数的一些人通过总结和反思而养成的信条和习惯。这一规范可让你:高效率地编程、编写高质量的代码、获得更高的回报。1.2质量标准1) 空间,如果不是特殊要求,程序应当尽可能少用空间,但对于某些需要反复使用的数据内容,特别是系统的字典数据,可以在系统中进行缓存,以提高性能。在某些要求性能的情况下,可以考虑以空间换取时间。2) 速度,程序应当是能在最优化的即最快的速度运行。一般有两个注意点,一:循环体内的代码应针对效率进行优化;二:反复使用的数据应缓存在内存中。3) 健壮性,不会因任何误操作(包括非法数值)使程序崩溃。4) 安全性,对于用户数据,或网络程序,应当保证其数据或网络的安全。5) 可测试性,提交的产品或模块应可编译、可执行,能够进行测试。6) 可维护性,详细的注解,且程序应当具有面向对象的构件及模快。并且遵守对象与变量的命名规范。7) 易用性,简单,易操作,易使用。8) 可复用性,构件能用于其它产品中。1.3为什么要进行编码约定?1) 使用统一编码约定集的主要原因,是使应用程序的结构和编码风格标准化,以便于阅读和理解编码。好的编码约定可使源代码严谨、可读性强且意义清楚。2) 编码约定的目的是使程序易于阅读和理解,而不是用过份的约束和绝对的限制来束缚程序员本身的创造性,故编码约定不能过于繁杂。3) 本文的约定中没列出每一个可能的对象或控件,根据工程及机构的特殊要求,可以扩充这些准则,以包含附加的元素。1.4 说明本规范参考了大量前人的成果.但又不局限于此。本规范没有完全按照.NET 推荐的命名规则而来,而是结合了自身的实际和许多Java规范中很多优秀的经验而制定。第二章 环境设置规范2.1开发环境Microsoft Visual Studio.NET2005 或20082.2工程设定 1) 不同.net项目名称的前8位不能相同2) 修改AssemblyInfo.cs 版本号,将 assembly: AssemblyVersion(1.0.*)中的1.0.*修改成具体的版本,目前一般改成1.0.0,随着新版本的升级,各个工程的AssemblyInfo.cs中的版本号需要与整个平台或项目的版本号保持一致。第三章 编码规范3.1命名规范首先,命名总的原则是名称应该说明“什么”而不是“如何”,命名要足够长以同其它变量相分别,简要描述其意义,但要足够短以避免太长.以下是几个方面的命名规范.总原则,虽然,C#的类,方法,变量都会区分大小写,但是不得用大小写来区分各种实体。1、不要创建仅是名称大小写有区别的两个命名空间。例如, namespace ee.cummings;namespace Ee.Cummings;2、不要创建具有仅是大小写有区别的参数名称的函数。下面的示例是不正确的。 void MyFunction(string a, string A)3、不要创建具有仅是大小写有区别的类型名称的命名空间。在下面的示例中,Point p 和 POINT p 是不适当的类型名称,原因是它们仅在大小写方面有区别。 System.Windows.Forms.Point pSystem.Windows.Forms.POINT p4、不要创建具有仅是大小写有区别的属性名称的类型。在下面的示例中,int Color 和 int COLOR 是不适当的属性名称,原因是它们仅在大小写方面有区别。 int Color get, setint COLOR get, set5、不要创建具有仅是大小写有区别的方法名称的类型。在下面的示例中,calculate 和 Calculate 是不适当的方法名称,原因是它们仅在大小写方面有区别。 void calculate()void Calculate()3.1.1工程的命名与属性设置工程命名一律使用前缀”Fs”,紧随其后的单词首字母大写,如FsConfigApp等。工程对应的程序集名称应与工程名称保持一致工程的默认命名空间设置成空3.1.2包命名(命名空间命名)与.NET推荐的规范中不同,本规范要求命名空间的命名全用小写,并且最好每个段只用一个单词。命名空间的第一个单词为组织名,如FORESTAR.第二个单词应该是工程相关的描述。如app表示应用程序,core表求核心。两个例子如下所示。FsCore工程 core db security utilfsConf工程 config dict flow layercatalog log orguser query role stat另外,如果命名空间有对应的子目录的话,该子目录的名称应该与命名空间严格保持一致。3.1.3类命名1) 名字应该能够标识事物的特性。2) 名字尽量不使用缩写,除非它是众所周知的,如DB。3) 名字可以有两个或三个单词组成,但通常不应多于三个。4) 在名字中,所有单词第一个字母大写。例如UserCatalog.5) 使用名词或名词短语命名类。 6) 不要使用下划线字符 (_)。 public class DBHelperpublic class BookMark7) 特别规定: 窗体类以Form开头,窗体变量以frm开头。 用户自定义控件以UI开头,其变量名以ui开头。 3.1.4接口命名和类命名规范相同,唯一区别是 接口在名字前加上“I”前缀public interface IPlugIn3.1.5函数1.函数命名 使用动词或动词短语命名方法。 将标识符的首字母和后面连接的每个单词的首字母都大写。如,以下是正确的命名方法。void GetCharArray()void RemoveAll()IDataReader GetUserByUserID(int userID)2.参数命名 参数命名可以是将标识符的首字母小写,而将后面连接的每个单词的首字母大写。 另外如果全部小写也是可以的。public int GetNextValidID(string tblName, string fldName)public ItemInfo(object objectvalue, object rendervalue) 参数个数最好控制在7个以内 对于每一个参数,在函数内部执行时首先要验证其合法性,不能不经验证直接使用。 参数顺序按照:输入-修改-输出的顺序定义。 3.函数长度 一般要控制到100行以内,最多不能超过200行、如果代码行数超过此范围考虑增加子程序3.1.6变量命名 每个变量(除计数器外)最好有明确的唯一的含义和用途,方便程序的阅读和使用。尽量不要定义temp,str等等没有明确含义的变量。 对于用到限定字符如:Total、Sum、Average、Max、Min、Record、String、Pointer这样的修饰词,需要将其放到名字的最后。 变量作用域标识符:全局变量(C#类的静态变量作为全局用途)g_、成员变量 m_ 对于类属性变量,采用第一单词小写开头,后面每一个单词首字母均大写的方法,访问级别设置为private,并按情况提供get方法或者set方法。如果只是需要公开的简单属性成员,则可以直接定义成public, 不必提供get方法或者set方法.public class ItemInfo private object m_pObjectValue = null;private object m_pRenderValue = null; public object Rendervalueget return renderValue; set renderValue = value; 尽可能在变量定义后就初始话变量,例如:对象可以初始化成null。 方法内部局部变量可以采用上面的类属性变量的命名方法,也可以采用全小写的命名法,但是要使用有意义的名称。 仅对于短循环索引使用单字母变量名,如 i 或 j,对于这类计数器要确保每次使用时都重新初始化。 针对异常捕获过程中的Exception变量命名,为了避免与方法中参数e的冲突,统一命名为exp or ex。try /code catch(Exception exp) /your code如果捕获异常不需要作任何处理,则不需要定义Exception实例:try/your codecatch( Exception ) 除数字0、1外,不要再代码中使用原义数字或原义字符串,如 for(int i = 1;i7;i+)。而是使用具名常量,如 for(int i = 1;i C_NUM_DAYS_IN_WEEK;i+) 以便于维护和理解,关于常量的命名,请见3.1.8节。 注意各类数字类型的数值范围,避免溢出错误和除0错误。对于浮点数要注意其判断语句和累加语句,不一定能够达到预定的值。3.1.8常量命名与枚举变量命名常量一般是为了易读和易于维护,将本应该是用到具体数字或字符串的地方换成常量。为了将常量和变量进行区分。常量命名应该遵守如下规则用C_开头后接字母规则如下:1) 字母全部大写,如:public static string C_NEWLINE=”rn”;2) 可以考虑采用下划线,如: public static int C_NUM_DAYS_IN_WEEK;枚举类型的命名采用以Enum开头,各单词首字母大写的方式.而枚举类型枚举项则把枚举类型名称作为前缀。但是是以小写字母开头,即enum开头.对于枚举变量的命名则一般变量命名一样.举例:public enum EnumLayerType enumLayerTypePoint = 0, enumLayerTypeLine = 1, enumLayerTypePolygon =2, enumLayerTypeAnnotation = 3;3.1.7 事件命名规则1) 名称总的说来第一个单词和其他单词的首字母都大写。 2) 对事件处理程序名称使用 EventHandler 后缀。 3) 对于复杂的事件的参数,可以参考.NET中的事件定义的参数,指定两个名为 sender 和 e 的参数。sender 参数表示引发事件的对象。sender 参数始终是 object 类型的,即使在可以使用更为特定的类型时也如此。与事件相关联的状态封装在名为 e 的事件类的实例中。对 e 参数类型使用适当而特定的事件类。 在实际的使用中,比较少使用这种方式,可以直接定义要传递的参数的类型,以及参数的数量。4) 考虑用动词命名事件。例如,命名正确的事件名称包括 Clicked、Painting 和 DroppedDown。 5) 使用动名词(动词的“ing”形式)创建表示事件前的概念的事件名称,用过去式表示事件后。例如,可以取消的 Close 事件应当具有 Closing 事件和 Closed 事件。不要使用 BeforeXxx/AfterXxx 命名模式。 6) 不要在类型的事件声明上使用前缀或者后缀。例如,使用 Close,而不要使用 OnClose。 7) 通常情况下,对于可以在派生类中重写的事件,应在类型上提供一个受保护的方法(称为 OnXxx)。此方法只应具有事件参数 e,因为发送方总是类型的实例。下面是一个比较规范的事件的定义public delegate void MouseEventHandler(object sender, MouseEventArgs e);public class MouseEventArgs : EventArgs int x; int y; public MouseEventArgs(int x, int y) this.x = x; this.y = y; public int X get return x; public int Y get return y; 3.1.8缩略词及控件命名在我们编程中,经常要用到缩略词,本规范要求的缩略词以文档常用缩略词为准:全局变量首字母大写,局部变量加上前缀,函数内临时变量不做具体限制,但注意命名要便于区分和阅读。通用前缀规定序号数据类型前缀举例1.Boolean(布尔值) bbLoggedIn2.Currency(货币)cur curSalary3.Double(双精度实数)d dMiles4.Single (单精度实数)ffMiles5.Long(长整型数)l lOnHand6.Integer(整型数)iiYear7.String(字符串)s或strsName8.VariantvvDateInfo9.Control(控件)UI UiLastControl10.Handle(句柄)hwnd hwndPicture11.ObjectobjobjUserInfo12.Array(数组)a asEmployees13.Use-defined type(用户定义的类型)udt udtEmployee14.类或接口对象PpSysUser标准控件前缀序号控件前缀举例1.复选框chkchkLoggedIn2.单选框opt optRed3.组合框comb combTitle4.列表框 lstlstResultCodes5.命令按钮cmdcmdCancel6.标注lbllblHelpMessage7.文本框txt txtAddress8.图象img imgIcon9.图片框pic picDiskSpace10.图文框frafraLanguage常用ActiveX控件序号控件前缀举例1.常用对话框dlg dlgFileOpen2.列表视图lvw lvwFiles3.树状视图tree treeFolders地理信息系统相关由于ArcGIS中的对象与接口太多,依据ArcGIS示例代码中的命名习惯,制订了以下约定。1) 对于过程级变量,可以使用 p+缩略词+用途 的命名方式,如pEnvInput,pFWksSource等。2) 缩略词中原始单词的每个首字母均大写,如FeatureWorkspace = FWks。3) 如果同类型变量只有一个时,而且不是重要变量时,可以省略用途。特别是过程内的临时变量,可以使用pPoint1,pPoint2命名方式。4) 对于名字不太长的接口,建议不使用缩略词,而是使用对象或接口的完整名称。3.2注释规范3.2.1.注释规则1、修改代码时,总是使代码周围的注释保持最新。2、在每个例程的开始,提供标准的注释样本以指示例程的用途、假设和限制很有帮助。注释样本应该是解释它为什么存在和可以做什么的简短介绍.3、避免在代码行的末尾添加注释;行尾注释使代码更难阅读。不过在批注变量声明时,行尾注释是合适的;在这种情况下,将所有行尾注释在公共制表位处对齐。 4 、避免杂乱的注释,如一整行星号。而是应该使用空白将注释同代码分开。 5 、避免在块注释的周围加上印刷框。这样看起来可能很漂亮,但是难于维护。6 、在部署发布之前,移除所有临时或无关的注释,以避免在日后的维护工作中产生混乱。7 、如果需要用注释来解释复杂的代码节,请检查此代码以确定是否应该重写它。尽一切可能不注释难以理解的代码,而应该重写它。尽管一般不应该为了使代码更简单以便于人们使用而牺牲性能,但必须保持性能和可维护性之间的平衡。8 、在编写注释时使用完整的句子。注释应该阐明代码,而不应该增加多义性。 9 、在编写代码时就注释,因为以后很可能没有时间这样做。另外,如果有机会复查已编写的代码,在今天看来很明显的东西六周以后或许就不明显了。10 、避免多余的或不适当的注释,如幽默的不主要的备注。11、 使用注释来解释代码的意图。它们不应作为代码的联机翻译。 12、 注释代码中不十分明显的任何内容。13 、为了防止问题反复出现,对错误修复和解决方法代码总是使用注释,尤其是在团队环境中。14 、对由循环和逻辑分支组成的代码使用注释。这些是帮助源代码读者的主要方面。 15 、在整个应用程序中,使用具有一致的标点和结构的统一样式来构造注释。 16 、用空白将注释同注释分隔符分开。在没有颜色提示的情况下查看注释时,这样做会使注释很明显且容易被找到。17 、在所有的代码修改处加上修改标识的注释。18 、为了是层次清晰,在闭合的右花括号后注释该闭合所对应的起点。注释规范包括:模块(类)注释规范、类的属性、方法注释规范、代码间注释3.2.2. 模块(类)注释规范 在类或模块的声明前请创建者对类名的功用做个简单说明,方法如下:/ /目的:/创建人:创建者中文名/创建日期:/修改描述:/修改人:/修改日期:/备注:/修改描述:/修改人:/修改日期:/备注:/ 这么说明的目的是在于找到创建责任人,注意请不要将创建人改为作者,因为代码不是某一个人所有,一个类或模块也基本上不可能由某一个人所写。如果模块有大的修改,请在上面的注释下加入修改的描述与修改者的信息3.2.3. 类属性注释规范在类的属性必须以以下格式编写属性注释:/ /属性说明/ 3.2.4. 方法注释规范重要的类方法在其声明前必须用以下格式编写注释/ / 说明:/ / param name=/ / / l 在方法声明的上一行连续敲3个/,就可以自动生成标准格式的注释3.2.5. 代码间注释规范1) 代码间注释分为单行注释和多行注释: 单行注释:/ 多行注释:/*多行注释*/2) 代码中遇到重要的语句块时必须添加注释(if,for,foreach,),添加的注释必须能够说明此语句块的作用和实现手段(所用算法等等),也就是说明“怎么做”。3.3 代码风格1) 所有的缩进为4个空格,使用VS.NET的默认设置。Visual Studio.Net设置:工具-选项-文本编辑器-C#-制表符-插入空格2) 在代码中垂直对齐左括号和右括号。if(x=0)Console.Write(用户编号必须输入!); else if (x = 1) 不允许以下情况:if(x=0) Console.Write(用户编号必须输入!); 或者:if(x=0)Console.Write(用户编号必须输入!);3) 为了防止在阅读代码时不得不滚动源代码编辑器,每行代码或注释在1024*768的显示频率下尽量不要超过一显示屏4) 每一行上放置的语句避免超过一条。5) 在大多数运算符之前和之后使用空格,这样做时不会改变代码的意图却可以使代码容易阅读。例:int j = i + k; 而不应写为int j=i+k;6) 将大的复杂的方法分为较小的、易于理解的方法,技巧:可以使用Reshaper的格式化代码功能。第四章 程序规范4.1语句4.1.1每行一个语句 每行最多包含一个语句。如 a+; b-; a+; b-; /不允许4.1.2复合语句复合语句是指包含父语句子语句;子语句;的语句,使用复合语句应遵循以下几点1) 子语句要缩进。2) 左花括号“” 在复合语句父语句的下一行并与之对齐,单独成行。3) 即使只有一条子语句要不要省略花括号“ ”。 如 while (d + = s+) n+; 4.1.3return 语句 return语句中不使用括号,除非它能使返回值更加清晰。如 return; return myDisk.size(); return (size ? size : defaultSize); 4.1.4if、 if-else、if else-if 语句 1) if if (condition) statements; 2) if-else if (condition) statements; else statements; 3) if else-if if (condition) statements; else if (condition) statements; else statements; 4.1.5 for、foreach 语句 for 语句使用格式 for (initialization; condition; update) statements; foreach 语句使用格式 foreach (object obj in array) statements;注意:原则上不得在循环过程中修改循环计数器。除非非常特殊的原因需要修改,但必须要使用注释说明原因,4.1.6 while 语句 while 语句使用格式 while (condition) statements; 空的 while 语句使用格式 while (condition); 4.1.7 do - while 语句 do - while 语句使用格式 do statements; while (condition); 4.1.8 switch - case 语句 switch - case 语句使用格式 switch (condition) case 1: statements; break; case 2: statements; break; default: statements; break; 注意:1. 语句switch中的每个case各占一行。2. 语句switch中的case按字母顺序排列。3. 为所有switch语句提供default分支,在default里可以抛出异常。 4. 所有的非空 case 语句必须用 break; 语句结束。4.1.9 try - catch 语句 try - catch 语句使用格式 try statements; catch (ExceptionClass ex) statements; finally statements; 4.1.10 using 块语句 using 块语句使用格式 using (object) statements; 4.2 效率原则1) 循环之内不要定义变量,2) 除非必须,循环内部不要构造新对象。3) 尽可能将能循环之内用到的能返回固定值的方法在外部定义成变量,可以显著减少方法的调用次数。4) 经常要用到的对象,尤其是窗体对象,不要频繁实例化。例如:在点击窗体类FormMain中的按钮btnInvoke要弹出FormInvoke。我们可以做如下处理:在窗体类FormMain 中声明变量:private FormInvoke frmInvoke=null;并为btnInvoke的单击事件写如下代码:private void BtnInvok_Click(object sender, System.EventArgs e) if(frmInvoke=null) frmInvoke=new FormInvoke(); frmInvoke.ShowDialog(); 或者frmInvoke.Show();5) String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。 例: StringBuilder sql=new StringBuilder();sql.Append(UPDATE TBSYS_BookMark SET BookMarkName = ); sql.Append(bookmark.BookMarkName);sql.Append(,Max=);sql.Append(bookmark.MaxX);sql.Append(,MaxY=);sql.Append(bookmark.MaxY);sql.Append(,MinX=);sql.Append(bookmark.MinX);sql.Append(,minY);sql.Append(bookmark.MinY); sql.Append(,SRName=);sql.Append(bookmark.SpatialRefName);sql.Append( WHERE id=);sql.Append(bookmark.BookMarkId); MdlMain.DbHelper.DoSQL(sql.ToString();6) 特别建议:SQL 语句的书写请将关键字全部大写.4.3 其它要求1) 回车换行constCrlf = rn;2) c#函数参数为引用类型时,实参名称前要加ref,且必须显式初始化。如类Cell定义函数Cell.GetSelectRange(ref int,ref int,ref int,ref int)则在调用时,使用int startcol = 0, startrow = 0, endcol = 0, endrow = 0;cell.GetSelectRange(ref startcol, ref startrow, ref endcol, ref endrow);其中,cell是Cell的对象,参数startcol等必须初始化。3) 判断某个对象是否实现某个接口,请用is进行检查,这相当于Java之中的instanceof。如检查类A的对象a是否实现了IB接口,可以用如下语句if(a is IB)C#中,请慎用 as 运算符进行类型转换,因为当转换失败时,as 运算符将返回空指针,而不是引发异常,所以最好用强制转换。4) 对于费时的操作前将鼠标设置为沙漏状,在操作完成之后设置为默认状态。并将主操作过程用异常控制语句包起来,以保证鼠标状态的正确变化。例:Cursor.Current = Cursors.WaitCursor;try/费时的操作过程catch(Exception ex) TraceHandler.AddErrorMsg(ex);Cursor.Current = Cursors.Default; 5) C# 中使用除法时,分子分母应该都使用double型 ,否则容易造成错误 例如 : Int i = 2 ; Int j = 10 ; Double m = i/j ; 这里如果不注意, m 的结果是等于 0 ,无法得到0.2,所以应该将 I 和 j 都转化为 double 型再进行除法 。 4.4有关窗口的问题1) 隐藏非模式窗口:this.hide() ,窗口不会从内存卸载2) 隐藏模式窗口:this.close() ,窗口不会从内存卸载3) 卸载非模式窗口:this.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信息技术五年级全册第21课 设计笔筒教案
- 歌曲《稻草里的火鸡》教学设计-2025-2026学年小学音乐花城版二年级上册-花城版
- 销售量协议合同书范本
- 绿化白蚁预防合同范本
- 绿化草子销售合同范本
- 衣服毛料买卖合同范本
- 酒店公司转让协议合同
- 看护风景雇佣合同范本
- 网络安全防护措施简析
- 数学常考题型试卷及答案
- 法务岗位招聘笔试题与参考答案(某大型国企)
- 全国巾帼家政服务职业技能大赛(养老护理员)理论考试题库-上(单选题)
- 【京东物流配送模式及优化建议探析11000字(论文)】
- 林麝养殖知识讲座
- 新疆的若干历史问题
- 脑梗死伴高血压3级病例分析专题报告
- 论文写作讲座(英语科技论文撰写与投稿)课件
- 肺癌知识讲座
- 国家一等奖《纪念刘和珍君》教学设计
- 医疗质量每月检查记录表
- vas疼痛评分完整版
评论
0/150
提交评论