OICS-01-02-NET程序编码规范v1..doc_第1页
OICS-01-02-NET程序编码规范v1..doc_第2页
OICS-01-02-NET程序编码规范v1..doc_第3页
OICS-01-02-NET程序编码规范v1..doc_第4页
OICS-01-02-NET程序编码规范v1..doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

运行管理系统项目运行管理系统项目 .NET 程序编码规范 OICS-01-02-NET 程序编码规范 v1.00 微软微软(中国中国)有限公司顾问咨询部有限公司顾问咨询部 2019 年年 2 月月 NET 程序编码规范 2 of 30 修改日期修改日期修改人修改人修改内容修改内容 2007-7-31戴辉江V1.00 发布 NET 程序编码规范 3 of 30 目录目录 1.概述概述5 2.命名规范命名规范5 2.1大写风格5 2.1.1Pascal风格5 2.1.2Camel风格5 2.1.3大写风格5 2.1.4大写小结6 2.2单词选择6 2.2.1缩写7 2.3命名空间7 2.4类和类成员8 2.4.1类的命名指南8 2.4.2Attribute命名指南8 2.4.3枚举命名指南9 2.4.4静态类属性名9 2.4.5参数名9 2.4.6方法命名指南9 2.4.7属性命名指南9 2.4.8事件命名指南10 2.5大小写敏感10 3.程序注释规范程序注释规范11 3.1模块注释11 3.2类的注释12 3.3类成员方法的注释13 3.4类成员属性、常量、变量的注释14 3.5程序注释14 4.类成员使用规范类成员使用规范14 4.1属性使用指南14 4.1.1只读和只写的属性17 4.2事件使用指南17 4.3方法使用指南18 4.3.1方法重载指南18 4.4构建函数使用指南19 4.5类的成员变量使用指南19 4.6参数名称指南21 5.类型使用指南类型使用指南21 5.1类使用指南22 NET 程序编码规范 4 of 30 5.1.1基类使用指南22 5.2值类型使用指南22 5.2.1结构使用指南22 5.2.2枚举使用指南23 5.3程序代理使用指南24 5.4程序属性(ATTRIBUTE)的使用 24 6.异常的产生和处理异常的产生和处理25 6.1标准异常类型27 6.2异常的包装 WRAPPING EXCEPTIONS28 7.数组使用指南数组使用指南29 7.1数组VS. 集合29 7.1.1集合29 7.1.2集合中可索引的属性29 7.1.3数组值属性29 7.2返回空数组29 8.日志和跟踪使用指南日志和跟踪使用指南30 8.1日志(LOG)使用指南30 8.2跟踪(TRACING)使用指南30 NET 程序编码规范 5 of 30 1. 概述概述 在建设过程中,将涉及到在新的 Visual Studio.NET 以及.NET Framework 平台上的开 发工作。同时,设计人员、开发人员和测试人员较多。为了使应用程序的结构和编码风格 标准化,便于阅读和理解编码,以提高开发效率和产品的标准化,制订一套开发规范和标 准势在必行。此外,好的编码约定可使源代码严谨、可读性强且意义清楚,与其它语言约 定相一致,并且尽可能的直观。希望开发人员严格遵守此套开发规范和标准,并落实到自 己的程序中。 一组通用目的的编码约定应该定义完成上述目的所必需的、能让程序员自由地创建程 序逻辑和功能流程的最小的要求。最小编码约定的目的是使程序易于阅读和理解,从而指 导程序员更好地完成开发任务。 本规范主要针对使用 Visual Studio.NET 以及.NET Framework 开发的基于 Web 的应用 系统。 2. 命名命名规范规范 在命名指南中要注意三个要素 、大小写大小写: 使用正确的大小写风格. 、技巧技巧: 使用名词来命名类,动词来命名方法等等. 、选择词汇选择词汇: 在库中使用一致的短语 以下章节描述了大小写技巧和一些词汇选择的原则. 2.1 大写风格大写风格 以下章节描述了不同方式的大写方式以下章节描述了不同方式的大写方式.这些术语将在通篇文档中被经常引用这些术语将在通篇文档中被经常引用. 2.1.1 Pascal 风格 这种风格大写每个单词的首字母 BackColor 应在所有由多单词组成的公共描述符中使用这种方式.举例而言,使用TextColor 就比 Textcolor 或 Text_color更好. 注意不要大写 “连接词”(一个单词中包含了几个单词,但这个单词本身有自己的意思,如 Checkbook)每个组合单词的首字母。应该将这个单词作为一个单词来考虑,而非几个单词的组 合。使用词典决定一个组合词是不是应该作为一个单词来使用。 2.1.2 Camel 风格 这种风格除了第一个单词的首字母,其他单词都应大写首字母,如下所示 backColor 在局部变量参数名或私有类属性名称上使用 camel 风格。 NET 程序编码规范 6 of 30 2.1.3 大写风格 只在少于两个字母的缩写中使用大写。三个以上字母的缩写都应该使用 PASCAL 风格。举 例而言 System.IO System.Web.UI System.CodeDom 一个另外的情形是和原有的未管理的标志兼容,而原来常用大写来表示枚举和常量。通常 这些标志符不应该暴露给外部。 2.1.4 大写小结 下表描述了不同类型的描述符该怎么使用大小写 类型类型风格风格备注备注 ClassPascal 风格 Enumeration valuePascal 风格 Enumeration typePascal 风格 EventPascal 风格 Exception classPascal 风格 用后缀 Exception. Read-only static fieldPascal 风格 InterfacePascal 风格 用前缀 I. MethodPascal 风格 NamespacePascal 风格 PropertyPascal 风格 Public instance fieldPascal 风格很少使用,更多使用 properties. Protected instance fieldcamel 风格很少使用,更多使用 properties. Parametercamel 风格 2.2 单词选择单词选择 、不要使用常用的命名空间的名字做类名,举例而言不要使用以下任何单词做类名 System Collections Forms UI 、不要使用和以下关键字冲突的识别符,举例而言,避免这样使用: AddHandlerAddressOfAliasAndAnsi AsAssemblyAutoBaseBoolean ByRefByteByValCallCase CatchCBoolCByteCCharCDate CDecCDblCharCIntClass CLngCObjConstCShortCSng CStrCTypeDateDecimalDeclare NET 程序编码规范 7 of 30 DefaultDelegateDimDoDouble EachElseElseIfEndEnum EraseErrorEventExitExternalSource False FinalizeFinally Float ForFriendFunctionGetGetType Goto HandlesIfImplementsImports InInheritsIntegerInterfaceIs LetLibLikeLongLoop MeModModuleMustInheritMustOverride MyBaseMyClassNamespaceNewNext NotNothingNotInheritableNotOverridableObject OnOptionOptionalOrOverloads OverridableOverridesParamArrayPreservePrivate PropertyProtectedPublicRaiseEventReadOnly ReDimRegionREMRemoveHandlerResume ReturnSelectSetShadowsShared ShortSingleStaticStepStop StringStructureSubSyncLockThen ThrowToTrueTryTypeOf UnicodeUntilvolatileWhenWhile WithWithEventsWriteOnlyXor eval extendsinstanceofpackagevar 2.2.1 缩写 、请不要砍掉或抽取识别符的部分来作为名称使用。如使用 GetWindow 比 GetWin 更好. 请不要使用使用不被广泛认可的缩写。 只有绝对需要时再使用广为人知的缩写。可以使用 UI 来表示 User Interface,用 OLAP 来表 示 On-line Analytical Processing. 当使用缩写时,请使用 Pascal 风格或 camel 风格来表示超过两个或以上单词缩写的构成。 如用 HtmlButton 而非 HTMLButton,但不要用 System.Io 来取代 System.IO 2.3 命名空间命名空间 以下模板举例说明了命名空间的命名规则。 .Design 因此我们希望看到这样如下命名空间: Microsoft.Media Microsoft.Media.Design PowerSoft.PowerBuilder.Math 、避免两个 PUBLISED 的 NAMESPACES 名称一样的可能。使用公司名称或者一个正式分支 的名称如用 Microsoft.Office 来表示 Microsoft 提供的 Office Automation Classes。 、使用一个稳定的被广泛认可的技术名称作为第二层名称 NET 程序编码规范 8 of 30 、不要使用组织的结构层次作为命名空间的层次依据. 、请在 DESIGN-TIME 命名空间前加上.Design 前缀以表示基础命名空间 DESIGN-TIME 特性。如 System.Windows.Forms.Design 包含了用来设计 System.Windows.Forms 应用程序 的的设计器和相关设计类。 、使用 PASCAL 风格,把每个逻辑部件用分隔号分开(如 Microsoft.Office.PowerPoint _)如 果你的品牌采用了非传统方式的命名,那么就延续的你的品牌的命名方式,就算他和通常的 命名空间法则不同。如(NeXT.WebObjects, and ee.cummings) 、在适当的地方使用复数命名。例如采用System.Collections 而非System.Collection。对此例 外的是品牌名和缩写。如用 System.IO 而非System.IOs。 、不要让命名空间和类都使用同样的名字。如,当有个类叫 Debug 时就不要使用 Debug 来作为命名空间的名字。 命名空间结构不需和配件名称结构并行。如,当你决定使用给配件取名叫 MyCompany.MyTechnology.dll 时,这并不需要你得让配件中包含一个叫 MyCompany.MyTechnology 的命名空间。 2.4 类和类成员类和类成员 2.4.1 类的命名指南 、使用名词或名词短语命名类。 、使用 Pascal 风格. 、谨慎使用缩写命名类。. 、不要使用任何类前缀(如 C). 、不要使用强调符号。 、偶尔可能会出现已 I 作为类名开头的情况,而这个类又不是一个接口类。这种情况下 只要第二个字母是小写就可以接受。如 IdentityStore. 、建议使用组合词来命名派生类。在此情况下,你应该考虑使用基类名称作为派生类名 称的结尾。举例而言,在英语中的”Coffee Cup”是说的一种杯子,而不是一种咖啡。又如 ApplicationException 表示一种例外,而 BooleanSwicth 表示一种 Switch,SerializableAtrribute 是一种属性。但对此应该合理的判断,如 Button 是一种 Control 虽然 Control 并没有出现在 名字中。 以下是一些正确的命名的例子 public class FileStream public class Button public class String 2.4.2 Attribute 命名指南 、在自定义属性类的后边应该加上 Attribute 作为后缀。 public class ObsoleteAttribute : Attribute NET 程序编码规范 9 of 30 2.4.3 枚举命名指南 、使用 Pascal 风格来命名枚举类型. 、使用 Pascal 风格命名枚举值. 、不要使用简写来命名枚举值. 不要在枚举前加前缀(如 adXXX 来命名 ADO enums, rtfXXX 来命名 rich text enums, 等.). 不要使用在枚举上加后缀 使用单数来命名枚举,除非它是一个 BIT 类属性. 使用复数来命名 BIT 类属性。 2.4.4 静态类属性名 、使用名词,名词短语或简写来命名静态类属性 、使用 PASCAL 风格来命名静态类属性 、不要使用匈牙利命名法来命名静态类属性名称 2.4.5 参数名 、使用有意义的参数名.在所有场合,参数名称和类型应该清楚地描述以决定其反映的意 义 、使用 camel 风格来命名参数 、使用名称来表现其作用而非表现其类型.我们期望开发工具能提供有效的方式来提供类 型信息.因此参数名可被更好的用来表现其作用而非类型.偶尔使用基于类型的参数名是完全 适当的. 、不要使用 reserved 参数。参数。在下个版本中需要更多的数据那么就使用重载。. 、请不要使用匈牙利命名法来在名称前加前缀 Type GetType (string typeName) string Format (string format, object args) 2.4.6 方法命名指南 、使用动词或动词短语来命名方法。 、使用 Pascal 风格来命名方法.如 RemoveAll() GetCharArray() Invoke() 2.4.7 属性命名指南 、使用名词或名词短语来命名属性 、使用 Pascal 来命名属性. 可以考虑把属性命名和其类型一样。当属性名和一个类型名一样时,那么一定要让这个属 性就是这个类型。虽然这听起来有点多余,但这是正确的。以下例子说明了正确的属性命 名方法. NET 程序编码规范 10 of 30 public enum Color . public class Control public Color Color get . set . 以下是错误的命名 public enum Color . public class Control public int Color get . set . 在错误的例子中,Color 枚举的成员不可能被引用到,因为 Color.xxx 的 COLOR 将被解 释为 Color(Int)属性,系统将会到 System.Int32 中的实例中去访问成员。. 2.4.8 事件命名指南 、使用事件 EventHandler 来命名 HANDLER(代理类型)。如 public delegate void MouseEventHandler(object sender, MouseEventArgs e); 、两个参数取名叫 sender 和和 e. sender 参数表示触发时间的对象。sender 都是 object 类型,就算是它可以是更明确的类型。 与事件关联的状态被封装到一个事件类的实例中 e 中.对它应该使用适当明确的事件类型。 如 public delegate void MouseEventHandler(object sender, MouseEvent e); 、使用 EventArgs 后缀来命名事件的参数,如 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; 、使用现在时态和过去时态来命名有“前”、“后”概念的事件。(不要使用 BeforeXxxAfterXxx).如,一个可以取消的关闭事件可以表示为 Closing 和 Closed event. 、考虑使用动词来命名事件 NET 程序编码规范 11 of 30 2.5 大小写敏感大小写敏感 、不要出现必须要大小写敏感支持的名字.组件应该在无论大小写敏感或不敏感的语言中 都能使用。因为 需要大小写敏感的语言不能识别两个相同内容但用大小写区分的名字,所 以组件必须避免这种情况 、不要出现两个只用大小写区分的命名空间,如 namespace ee.cummings; namespace Ee.Cummings; 、不要出现两个只用大小写区分的参数如. void foo(string a, string A) 、不要出现只用大小写区分的同一命名空间的类型 System.WinForms.Point p; System.WinForms.POINT pp; 、不要出现只用大小写区分的同一类型属性。 int Foo get, set; int FOO get, set 、不要出现两个只用大小写区分的方法 void foo(); void Foo(); 3. 程序注释规范程序注释规范 要使程序易于理解,注释十分重要。在此,提供基本的注释编写规范。 3.1 模块注释模块注释 在一个程序模块的开始,应用注释说明模块的名字、功能、开发者和日期和版本变更历史, 如下所示: /- /Name: ChargeUser /Function:Charge credits from the user account and save it to the users account /Author:Author Name / Date:Aug. 8, 2000 /- /Change History: / DateWhoChanges Made /- /2000-5-1Author1Initial creation /2000-5-15 Author2Add bStatus variable to identify Users state NET 程序编码规范 12 of 30 /2000-7-3Author3Add CheckBlackList() to check whether user /is in black list /- 3.2 类的注释类的注释 在定义一个类之前,应用“/”注释说明类的功能、使用方法和特殊的属性,如下所示: / / This class contains the business facade for the order system. / / The business facade is used to provide a simplified interface into the / order sub systems. / / / / This class is marked as MarshalByRefObject to support remoted scenarios. / / public class OrderSystem : MarshalByRefObject 须注意的是,我们要遵从 VS.NET 对注释的约定,使用标记来指定类总体注释 的开始,用标记它的结束。对类的一些注解说明可以放在 和 对中。以后我们可以从这些注解自动得到对代码的说明文档。如下例所示: Duwamish7.BusinessFacade.OrderSystem Class This class contains the business facade for the order system. The business facade is used to provide a simplified interface into the order sub systems. This class is marked as MarshalByRefObject to support remoted scenarios. Access: Public Base Classes: MarshalByRefObject MembersDescription GetOrderSummary Fills in the order summary data for an order. The order that is being worked on. Updated OrderData object. This is returned to support the remoted scenario (OrderData is a MarshalByValue object). class=System. ApplicationException The order is null. AddOrder Add an order and return the transaction id. The order that is being worked on. The order NET 程序编码规范 13 of 30 that has just been added. class=System. ApplicationException The order is null. Remarks: The business facade is used to provide a simplified interface into the order sub systems. This class is marked as MarshalByRefObject to support remoted scenarios. 3.3 类成员方法的注释类成员方法的注释 在定义类成员方法前,应说明该过程/函数的名字、功能、输入/输出和版本变更历史,如下 所示: / / Fills in the order summary data for an order. / The order that is being worked on. / Updated OrderData object. / / This is returned to support the remoted scenario (OrderData is a / MarshalByValue object). / / / /- / Change History: /DateWhoChanges Made / 2000-5-1Author1Initial creation / 2000-5-15Author2Add bStatus variable to identify Users state /- public OrderData GetOrderSummary(OrderData order) 在这里“” 和“”指明方法的参数的描述 信息;“” 和“”对说明了方法返回值的特性。 由这些注解自动得到的说明文档如下所示: Duwamish7.BusinessFacade.OrderSystem.GetOrde rSummary Function Fills in the order summary data for an order. The order that is being worked on. Updated OrderData object. This is returned to support the remoted scenario (OrderData is a MarshalByValue object). Public OrderData GetOrderSummary (OrderData) NET 程序编码规范 14 of 30 TypeNameDescription OrderDataorderThe order that is being worked on. ReturnDescription OrderData Remarks: This is returned to support the remoted scenario (OrderData is a MarshalByValue object). 3.4类成员属性、常量、变量的注释类成员属性、常量、变量的注释 在定义类成员属性前,应描述该属性,如: / / 档案编号 / publicStringDonorID; 对于模块级的常量、变量应该象类成员属性一样写注释。 3.5 程序注释程序注释 在代码实现时,应对其目的和实现的功能进行说明,其要点是: (1)采用了特殊的语法需要对语法注释; (2)为实现部分功能需要注释; (3)不能通过上下文立即明白其功能需要注释。 如下例所示: public OrderData GetOrderSummary(OrderData order) / / Check preconditions / ApplicationAssert.CheckCondition(order != null, “Order is required“, ApplicationAssert.LineNumber); / / Calculate subTotal / Decimal subTotal = 0; 4. 类成员类成员使用规范使用规范 4.1 属性使用指南属性使用指南 、使用 Pascal 风格来命名属性 public class Foo NET 程序编码规范 15 of 30 public Color BackColor 、不要使用匈牙利命名法. 、建议不要使用相同的类的属性名字和类型名字. 将一个类的属性名定义成与某个类型(Type)的名字相同会在某些编程语言中引起二义性. 最好避免这种二义性除非由非常正当的理由去这么做。 例如: System.Windows.Forms 类有一个 Icon 属性, 虽然也有一个 Icon 类 但由于 Form.Icon 这个名字比 Form.FormIcon 或 Form.DisplayIcon 这样的类属性名更容易理解, 所以我们仍采用 Icon 属性名. 但是在 System.WinForms. UI.Control 类中有一个颜色属性. 由于已经有了一个 Color 类, 这个类的颜色颜色属性就被命名为 BackgroundColor. 这是一个 更有意义的命名且与已经存在的类的名字不冲突. 、当对一个类中属性作赋值操作时发生了异常(Exception)时,一定要保证这个属性中还 保留着以前保存的属性值。避免这个属性的内容处于不确定状态. 、必须允许类的属性可以以任意的顺序赋值. 属性与其他属性间应该是没有状态关系的. 通常情况下只有当程序对一组属性作了赋值之后,这个对象的某个功能才会被激活,或者 只有当这个对象在一些正确的状态下, 这个功能才会起作用. 而且当对象进入此状态时, 这 个功能会被自动激活而无需任何其他的显示(Implicit)调用. 例如一个 TextBox 有两个相关的属性: DataSource 和 DataField. DataSource 指明了数据 表名, 而 DataField 指明了相应的类属性名. 一旦这两个属性被指明后, 这个控件就会把数 据表中相应的数据取出赋给这个控件的 Text 属性. 下面的例子演示了我们可以以任意的顺 序设置控件的属性. TextBox t = new TextBox(); t.DataSource = “Publishers“; t.DataField = “AuthorID“; / The data binding feature is now active. 上面的代码是与下面的程序等效的. TextBox t = new TextBox(); t.DataField = “AuthorID“; t.DataSource = “Publishers“; / The data binding feature is now active. 此外, 程序员可以将一个属性设为 null, 指明这个属性是未赋值的. TextBox t = new TextBox(); t.DataField = “AuthorID“; t.DataSource = “Publishers“; / The data binding feature now active t.DataSource = null; / The data binding feature is now inactive 下面的例子演示了如何做到对属性的赋值顺序复关,并检查数据绑定的状态并在适当的时 候自动激活相应的功能. public class TextBox NET 程序编码规范 16 of 30 string dataSource; string dataField; boolean active; public string DataSource get return dataSource; set if (value != dataSource) / Update active state. SetActive(value!= null dataSource = value; public string DataField get return dataField; set if (value != dataField) / Update active state. SetActive(dataSource != null dataField = value; void SetActive(boolean value) if (value != active) if (value) Activate(); Text = dataBase.Value(dataField); else Deactivate(); Text = “; active = value; / set active only if success void Activate() NET 程序编码规范 17 of 30 / open database void Deactivate() / close database 4.1.1 只读和只写的属性 、当在逻辑上要求用户不能改变类的属性时,需要使用只读属性. 、禁止使用只写属性. 4.2 事件使用指南事件使用指南 、使用 Pascal 风格来命名事件. 、不要使用匈牙利命名法. 、应该使用“raise”(“产生”)术语来表示产生事件而不是使用“fire“ 或 “trigger”. 当在文档中描述事件时, 应该使用“an event was raised“ 而不是 “an event was fired“ 或 “an event was triggered.” 、应考虑用动词来命名一个事件. 、事件处理程序应返回 void 值. 例如: public delegate void MouseEventHandler(object sender, MouseEventArgs e); 、因该从 System.EventArgs 类中派生出事件处理数据类。例如: public class MouseEventArgs : EventArgs 、应该假设在事件处理过程中会发生任何事情(要注意异常处理). 类应该准备事件处理过程会修改任何的事物, 而且需要保证在事件被生成时所有的对象都处 于一个合法的状态. 应该考虑使用 try/finally 程序块在事件产生的地方. 由于程序员调用了 call back 函数在这个对象上执行操作, 就不应该在程序控制返回后对程序状态做任何假设. 例如: public class Button ButtonClickHandler onClickHandler; protected void DoClick() PaintDown(); / paint button in depressed state try OnClick(); / call event handler finally / window may be deleted in event handler NET 程序编码规范 18 of 30 if (windowHandle != null) PaintUp(); / paint button in normal state protected virtual void OnClick(ClickEvent e) if (onClickHandler != null) onClickHandler(this, e); 4.3 方法使用指南方法使用指南 、使用 Pascal 风格来命名事件. 、不要使用匈牙利命名法. 、缺省使用非虚函数的方法. 4.3.1 方法重载指南 当一个类中有两个同名的方法可以使用,只不过他们有不同的调用参数时,我们需要方法 重载. 、当你要在类中提供两个不同的方法而他们的语意相同时,应该使用方法重载. 、用重载来实现方法的缺省参数。(缺省参数这种方法无法很好地翻译,因此在通用语言 规范 CLS 中是不允许的). int String.IndexOf (String name); int String.IndexOf (String name, int startIndex); 、当参数个数是变化的时候应该使用方法重载. 当一个方法接受的参数个数必须是可变的时候,我们可以通过重载定义 N 个参数个数渐长 的方法来解决, 同时还提供一个重载的方法跟随一个数组参数(为参数个数大于 N 的客户). N=3 or N=4 是一个比较适合的方法. 例如: public class Foo public void Bar(string a) Bar(new string a); public void Bar(string a, string b) Bar(new string a, b); public void Bar(string a, string b, string c) Bar(new string a, b, c); NET 程序编码规范 19 of 30 public virtual void Bar(string args) / core implementation here 可变长度参数 你可以希望提供一个方法可以接受不定个数的参数 (比如像 C 语言的 printf 函数). 对于受 管理的代码, 我们可以用 ParamsAttribute 模式来构造这种结构. 例如, 你可以用下面的代码 来代替多个重载的方法. void Format (string formatString, params object args) 你不能使用 VarArgs 式的调用规范 () 来实现不定个数的参数,这是应为通用语言规范 (CLS)不支持它. 4.4 构建函数使用指南构建函数使用指南 、只有当一个类中仅有静态的方法和属性时,我们才能使用私有的构造方法. public sealed class Enviroment private Enviroment(); / Prevents the class from being created. / 、在构造函数中尽量做最少的工作.多余的功能应该留到后续的代码中,当客户代码调用 这个功能时在座相应的工作。 、建议不要在“struct” (value types)中定义一个空的构造函数. 如果一个结构没有构造函数, CLR 运行时就会自动将结构的所有成员属性设为 0. 这能够提 高数组或结构初始化的速度. 4.5 类的成员变量使用指南类的成员变量使用指南 、不要将类成员变量设为外界可直接访问的.应考虑提供 get 和 set 的成员存取方法来 代替将成员变量设为 public. public struct Point private int x; private int y; public Point(int x, int y) this.x = x; this.y = y; NET 程序编码规范 20 of 30 public int X get return x; set x = value; public int Y get return y; set y = value; 如要将一个成员变量提供给继承的子类,应该使用一个 a protected (family) 的方法返回这个 成员的值. public struct Control : Component private int handle; protected int Handle get return handle; 通过避免将成员变量直接暴露给开发者,类可以更容易地被改写: 一个成员变量能可以被改成一个属性而同时又能维持二进制兼容. 对类成员的访问方法 get 和 set 能允许日后对类的改进, 比如根据对类属性的调用按需创 建对象, 或是添加属性修改的事件处理. 、避免在类成员的名字中使用缩写. class Foo string url; string destinationUrl; 、不要使用匈牙利命名法. 好的名字应该描述语法而不是类型. NET 程序编码规范 21 of 30 4.6 参数名称指南参数名称指南 、一定要对参数作校验. 在每个公共的方法或属性的 set accessor 内应该对输入参数的合 法性作检验。若发现有误应该抛出有意义的异常给程序员. 在这里应该使用 System.ArgumentException 异常或它的子类. class Foo public int Count get return count; set if (count = MaxValue) throw new ArgumentOutOfRangeException( Sys.GetString( “InvalidArgument“, “value“, count.ToString() ); public void Select(int start, int end) if (start = 0) / do something 、如果在不适当的状态下,就应激发一个 InvalidOperationException .(Do throw an InvalidOperationException if in an inappropriate state.) 如果因为在当前对象的状态下, 不恰当的设置属性或调用方法应该激发一个 System.InvalidOperationException . 、如果有错误的参数被传递或被检测到,就甩出一个 ArgumentException. 应能在堆栈中分别出激发例外的那个地方.而不是它被用 new 操作符创建的点,你应该仔细 考虑在哪里激发异常. 、 使用异常 BUILDER 方法 通常在类中不同的执行的地方都会甩出同样的异常.为避免代码膨胀, 用 HELPER 方法来 new 一个异常再返回这个异常.举例而言: class File string fileName; public byte Read(int bytes) if (!ReadFile(handle, bytes) throw NewFileIOException(); FileException NewFileException() string description = / build localized string, including fileName return new FileException(description); 、 宁愿用异常而不要使用错误代码 Do throw Exceptions rather than return an error code. NET 程序编码规范 27 of 30 、 激发异常应尽量具体 Do throw the most specific exception possible. 、 请尽量使用存在的异

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论