Net开发规范概述及高考语文试卷_第1页
Net开发规范概述及高考语文试卷_第2页
Net开发规范概述及高考语文试卷_第3页
Net开发规范概述及高考语文试卷_第4页
Net开发规范概述及高考语文试卷_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

.net开发规范目录TOC\o"1-3"\h\z1.概述42.命名规范4指导性原则4使用正确的大小写风格4使用描述性英文名称4使用易读的名称4尽量避免在名称中使用编码5同义词中使用固定的单词5保持词义的前后一致5名词和动词的选用5使用计算机专业术语5必要时可使用业务术语6避免误导6名词需要语境说明6不要添加人为的语境6.13避免名称差别不明显造成混淆6大写风格6Pascal风格7Camel风格7大写风格7大写小结7单词选择8缩写8命名空间9类和类成员9类的命名指南9Attribute命名指南10枚举命名指南10.4静态类属性名10参数名10方法命名指南11属性命名指南11事件命名指南11大小写敏感123.程序注释规范12注释编写准则12模块注释13类的注释13类成员方法的注释15类成员属性、常量、变量的注释16程序注释164.代码书写规范16排版规范165.类成员使用规范20属性使用指南20只读和只写的属性22事件使用指南22方法使用指南23方法重载指南23构建函数使用指南24类的成员变量使用指南25参数名称指南266.类型使用指南27类使用指南27基类使用指南27值类型使用指南28结构使用指南28枚举使用指南28程序代理使用指南30程序属性(Attribute)的使用307.异常的产生和处理30标准异常类型33异常的包装WrappingExceptions348.数组使用指南34数组vs.集合34集合34集合中可索引的属性34数组值属性35返回空数组359.数据库设计开发规范35命名规范35字段设计要求36视图使用原则36存储过程建立规则36函数建立规则36触发器使用要求36概述在建设过程中,将涉及到在新的VisualStudio.NET以及.NETFramework平台上的开发工作。同时,设计人员、开发人员和测试人员较多。为了使应用程序的结构和编码风格标准化,便于阅读和理解编码,以提高开发效率和产品的标准化,制订一套开发规范和标准势在必行。此外,好的编码约定可使源代码严谨、可读性强且意义清楚,与其它语言约定相一致,并且尽可能的直观。希望开发人员严格遵守此套开发规范和标准,并落实到自己的程序中。一组通用目的的编码约定应该定义完成上述目的所必需的、能让程序员自由地创建程序逻辑和功能流程的最小的要求。最小编码约定的目的是使程序易于阅读和理解,从而指导程序员更好地完成开发任务。本规范主要针对使用VisualStudio.NET以及.NETFramework开发的基于Web的应用系统。命名规范指导性原则命名是编程的核心。能够对变量和函数/过程进行表意清晰而准确的命名,就能使程序的可读性大大提高,达到不说自明的效果。真正的名称是深入认真思考一个对象的生态环境后才能给出的。程序设计人员只有在充分理解并把握整个系统时,才可能给出真正合适的名字。如果名称选用恰当,一切就显得很自然,各部分关系清晰,意义可以推导而出,阅读程序时可以按常识推理,从而减小程序员对已有程序的阅读和理解困难,提高工作效率,使新程序员能在尽量短的时间内进入角色。以下章节描述了程序命名的一些指导性原则。使用正确的大小写风格为保证良好的程序可读性,对命名的大小写必须按照一致的规定编写,主要包括Pascal风格和Camel风格两种,下面将会有专门的章节进行详细说明。使用描述性英文名称为保证程序的可读性,要采用准确描述其意义的名字。英语是国际通用语言,绝大多数商业类库或函数库代码都是由英语编写的。要与标准接轨,充分利用网上的程序资源,应尽量使用英语命名。使用易读的名称如果不可读或不易读,则不便于讨论和交流。因此我们要尽量使用大众化名称,避免使用不常用的单词。尽量避免在名称中使用编码对名称使用编码就需解码才能理解。少数几个前缀字母有助于区分名称类别。但为了追求风格而过分使用前缀和后缀就会造成生涩难懂的名字。例如SRD2T3。含有编码的名称一般都没有可读性。当然,任何编码,只要科学,时间久了都能被掌握。但是,掌握编码需要新成员的额外精力,增加了适应难度,因此应尽量避免。同义词中使用固定的单词首先,我们应尽量使用英语词汇,因为汉语拼音实际上也是一种名称编码,特别是使用拼音首字母,即使是懂汉语拼音的人也未必能理解。有了用英语命名的前提,我们还应该注意:一个抽象概念可能有多个表述同义词,选择一个,始终如一。如对同一动作,在不同类中选用不同的名称,比如,fetch,retrieve和get,那么,使用你的类从事编程的人就要多费很多精力去理解它们。也就是说,我们应该通过使用一致的名称,创建统一的编程接口,简化学习的难度。保持词义的前后一致多数词都有不止一个意思,但在同一个系统中,应始终保持同一个意思。这和前面的原则是相对应的。使用不同的词汇,使人联想不同的接口和/或操作。同样,使用同样的词汇,使人联想相同的接口和/或操作。如果我学过使用DeviceManager::add(),我就会期望可以使用ProtocolManager::add().这是根据名称产生的联想,甚至连想到可以使用*Manager::add()。要保证这种联想能成立,前后词义必须一致。如果自己设计一个系统,要尽量做到保持词义的一致。记住,在两个完全不同的范畴内使用相同的名字是很不可取的。名词和动词的选用类和对象应当使用名词或名词短语命名。方法中强调过程用动词,返回值用名词。作为一名设计人员,可能不太在意这些命名的琐事。尝试使用你设计的类去编写一段用户程序,看看有多少别扭或混乱的地方,一定可以反过来有助你改进设计。使用计算机专业术语尽量使用约定成俗的惯用语、计算机科学术语、算法名称、设计模式名称、数学名词等软件编程相关名词。这样似乎有点异端,但这总好过让程序员费劲找客户弄清楚自己原本清楚的概念,只是由于名称的不同使他们疑惑。我们是讲编码规范,程序员大多数是计算机专业的,或对计算机专业已有了深入了解的。很少最终用户会阅读程序,即使有,也是有相当计算机软件功底的。相反,程序维护人员必须阅读程序,所以应尽可能使用计算机术语。如:运用工厂模式类的命名应该是“名词+Factory”。必要时可使用业务术语如果工作的重点不在程序本身,或问题的描述比问题的解决更重要,可使用业务术语。在分析阶段,使用业务术语比使用计算机术语更好,因为容易被客户理解和接受。避免误导避免使用已有其它明确意义的名词。例如,"hp","aix",和"sco"被用作UNIX平台及其变种的名称,如果再用来作为变量或函数名称就很有问题,会引起误解。即使你在解决的问题用"hp"是很好的缩写也不应使用"hp"。名词需要语境说明只有少数情况下,孤立的一个名字有明确含义。多数情况下,名称需要置于一定的语境中才有意义。比如,在类中,函数中或注释中。换句话说,在面向对象的语言中,在类属性的名称中包含类名是多余的。例如,不应该使用,而应该使用Book.Title。Company.address_和Customer.address_,同样都是address,但仅在语境中才有意义,以下的命名是不可取的:CpanyAddress_,Customer.customerAddress_。不要添加人为的语境不要在类的前面冠以公司名缩写、项目名称缩写或其他标志性前缀。例如,在做知识管理系统时,把员工类命名成KmsUser。以上命名法是不可取的,这样势必造成代码重复,影响代码的重用。如使用同一个类,则KmsUser在其他系统中就显得不和谐了。避免名称差别不明显造成混淆这个问题源于编写程序仅仅是为了能编译通过或能解译执行。编译和解译程序不允许在同一域内用相同的名字指称两个东西。所以,遇到编译问题时,就随便将其中的一个改变一下。更糟糕的是,原本同一个名称,因拼写错误变成两个名称。这里要说的关键问题是,如果要区分两样不同的东西,一定要保证名称有实质性的差别。例如,若将一个类命名成Product,另一个类命名成ProductInfo或ProductData,就会因差别不明显造成混淆。因为Info和Data没有具体的意思。同理,不要在OO编程中使用Class或Object作为名称的一部分。CustomerObject和Customer有什么区别?NameString比Name好吗?难道一个Name还会是浮点数或整数不成?特别要强调的是,对于大小写敏感的编程环境,我们不要使用仅有大小写区别的名字。例如,Customer,customer不应作为两个名字。大写风格以下章节描述了不同方式的大写方式.这些术语将在通篇文档中被经常引用.Pascal风格这种风格大写每个单词的首字母BackColor应在所有由多单词组成的公共描述符中使用这种方式.举例而言,使用TextColor就比Textcolor或Text_color更好.注意不要大写“连接词”(一个单词中包含了几个单词,但这个单词本身有自己的意思,如Checkbook)每个组合单词的首字母。应该将这个单词作为一个单词来考虑,而非几个单词的组合。使用词典决定一个组合词是不是应该作为一个单词来使用。Camel风格这种风格除了第一个单词的首字母,其他单词都应大写首字母,如下所示backColor在局部变量参数名或私有类属性名称上使用camel风格。大写风格只在少于两个字母的缩写中使用大写。三个以上字母的缩写都应该使用PASCAL风格。举例而言一个另外的情形是和原有的未管理的标志兼容,而原来常用大写来表示枚举和常量。通常这些标志符不应该暴露给外部。大写小结下表描述了不同类型的描述符该怎么使用大小写类型风格备注ClassPascal风格

EnumerationvaluePascal风格

EnumerationtypePascal风格

EventPascal风格

ExceptionclassPascal风格用后缀Exception.Read-onlystaticfieldPascal风格

InterfacePascal风格用前缀I.MethodPascal风格

NamespacePascal风格

PropertyPascal风格

PublicinstancefieldPascal风格很少使用,更多使用properties.Protectedinstancefieldcamel风格很少使用,更多使用properties.Parametercamel风格

单词选择不要使用常用的命名空间的名字做类名,举例而言不要使用以下任何单词做类名SystemCollectionsFormsUI不要使用和以下关键字冲突的识别符,举例而言,避免这样使用:AddHandlerAddressOfAliasAndAnsiAsAssemblyAutoBaseBooleanByRefByteByValCallCaseCatchCBoolCByteCCharCDateCDecCDblCharCIntClassCLngCObjConstCShortCSngCStrCTypeDateDecimalDeclareDefaultDelegateDimDoDoubleEachElseElseIfEndEnumEraseErrorEventExitExternalSourceFalseFinalizeFinallyFloatForFriendFunctionGetGetTypeGotoHandlesIfImplementsImportsInInheritsIntegerInterfaceIsLetLibLikeLongLoopMeModModuleMustInheritMustOverrideMyBaseMyClassNamespaceNewNextNotNothingNotInheritableNotOverridableObjectOnOptionOptionalOrOverloadsOverridableOverridesParamArrayPreservePrivatePropertyProtectedPublicRaiseEventReadOnlyReDimRegionREMRemoveHandlerResumeReturnSelectSetShadowsSharedShortSingleStaticStepStopStringStructureSubSyncLockThenThrowToTrueTryTypeOfUnicodeUntilvolatileWhenWhileWithWithEventsWriteOnlyXorevalextendsinstanceofpackagevar缩写1、请不要砍掉或抽取识别符的部分来作为名称使用。如使用GetWindow比GetWin更好.2、请不要使用使用不被广泛认可的缩写。3、只有绝对需要时再使用广为人知的缩写。可以使用UI来表示UserInterface,用OLAP来表示On-lineAnalyticalProcessing.4、命名空间以下模板举例说明了命名空间的命名规则。<Company>.<Technology>[.<Feature>][.Design]因此我们希望看到这样如下命名空间:PowerSoft.PowerBuilder.Math避免两个PUBLISED的NAMESPACES名称一样的可能。使用公司名称或者一个正式分支的名称如用Microsoft提供的OfficeAutomationClasses。使用一个稳定的被广泛认可的技术名称作为第二层名称不要使用组织的结构层次作为命名空间的层次依据请在DESIGN-TIME命名空间前加上.Design前缀以表示基础命名空间DESIGN-TIME特性。如包含了用来设计应用程序的的设计器和相关设计类。使用PASCAL风格,把每个逻辑部件用分隔号分开(如Microsoft.Office.PowerPoint_)如果你的品牌采用了非传统方式的命名,那么就延续的你的品牌的命名方式,就算他和通常的命名空间法则不同。如(NeXT.WebObjects,andee.cummings)s而非System.Collection。对此例外的是品牌名和缩写。如用System.IO而非System.IOs。不要让命名空间和类都使用同样的名字。如,当有个类叫Debug时就不要使用Debug来作为命名空间的名字。命名空间结构不需和配件名称结构并行。如,当你决定使用给配件取名叫MyCompany.MyTechnology.dll时,这并不需要你得让配件中包含一个叫MyCompany.MyTechnology的命名空间。类和类成员类的命名指南使用名词或名词短语命名类。使用Pascal风格谨慎使用缩写命名类。不要使用任何类前缀(如C)不要使用强调符号。偶尔可能会出现已I作为类名开头的情况,而这个类又不是一个接口类。这种情况下只要第二个字母是小写就可以接受。如IdentityStore.建议使用组合词来命名派生类。在此情况下,你应该考虑使用基类名称作为派生类名称的结尾。举例而言,在英语中的”CoffeeCup”是说的一种杯子,而不是一种咖啡。又如ApplicationException表示一种例外,而BooleanSwicth表示一种Switch,SerializableAtrribute是一种属性。但对此应该合理的判断,如Button是一种Control虽然Control并没有出现在名字中。以下是一些正确的命名的例子publicclassFileStream{}publicclassButton{}publicclassString{}Attribute命名指南在自定义属性类的后边应该加上Attribute作为后缀。publicclassObsoleteAttribute:Attribute{}枚举命名指南使用Pascal风格来命名枚举类型.使用Pascal风格命名枚举值.不要使用简写来命名枚举值.不要在枚举前加前缀(如adXXX来命名ADOenums,rtfXXX来命名richtextenums,等.).不要使用在枚举上加后缀使用单数来命名枚举,除非它是一个BIT类属性.使用复数来命名BIT类属性。静态类属性名1、使用名词,名词短语或简写来命名静态类属性2、使用PASCAL风格来命名静态类属性不要使用匈牙利命名法来命名静态类属性名称参数名使用有意义的参数名.在所有场合,参数名称和类型应该清楚地描述以决定其反映的意义..使用camel风格来命名参数使用名称来表现其作用而非表现其类型.我们期望开发工具能提供有效的方式来提供类型信息.因此参数名可被更好的用来表现其作用而非类型.偶尔使用基于类型的参数名是完全适当的.不要使用reserved参数。在下个版本中需要更多的数据那么就使用重载。.请不要使用匈牙利命名法来在名称前加前缀TypeGetType(stringtypeName)stringFormat(stringformat,object[]args)方法命名指南使用动词或动词短语来命名方法。使用Pascal风格来命名方法.如RemoveAll()GetCharArray()Invoke()属性命名指南使用名词或名词短语来命名属性使用Pascal来命名属性.可以考虑把属性命名和其类型一样。当属性名和一个类型名一样时,那么一定要让这个属性就是这个类型。虽然这听起来有点多余,但这是正确的。以下例子说明了正确的属性命名方法.publicenumColor{...}publicclassControl{publicColorColor{get{...}set{...}}}以下是错误的命名publicenumColor{...}publicclassControl{publicintColor{get{...}set{...}}}在错误的例子中,Color枚举的成员不可能被引用到,因为Color.xxx的COLOR将被解释为Color(Int)属性,系统将会到System.Int32中的实例中去访问成员。.事件命名指南使用事件EventHandler来命名HANDLER(代理类型)。如publicdelegatevoidMouseEventHandler(objectsender,MouseEventArgse);两个参数取名叫sender和e.sender参数表示触发时间的对象。sender都是object类型,就算是它可以是更明确的类型。与事件关联的状态被封装到一个事件类的实例中e中.对它应该使用适当明确的事件类型。如publicdelegatevoidMouseEventHandler(objectsender,MouseEvente);使用EventArgs后缀来命名事件的参数,如publicclassMouseEventArgs:EventArgs{intx;inty;publicMouseEventArgs(intx,inty){this.x=x; this.y=y; }publicintX{get{returnx;}}publicintY{get{returny;}}}使用现在时态和过去时态来命名有“前”、“后”概念的事件。(不要使用BeforeXxx\AfterXxx).如,一个可以取消的关闭事件可以表示为Closing和Closedevent.考虑使用动词来命名事件大小写敏感不要出现必须要大小写敏感支持的名字.组件应该在无论大小写敏感或不敏感的语言中都能使用。因为需要大小写敏感的语言不能识别两个相同内容但用大小写区分的名字,所以组件必须避免这种情况不要出现两个只用大小写区分的命名空间,如namespaceee.cummings;namespaceEe.Cummings;不要出现两个只用大小写区分的参数如.voidfoo(stringa,stringA)不要出现只用大小写区分的同一命名空间的类型System.WinForms.Pointp;System.WinForms.POINTpp;不要出现只用大小写区分的同一类型属性。intFoo{get,set};intFOO{get,set}不要出现两个只用大小写区分的方法voidfoo();voidFoo();程序注释规范要使程序易于理解,注释十分重要。在此,提供基本的注释编写规范。注释编写准则将注释与注释分隔符用一个空格分开。不允许给注释加外框。边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。注释的内容要清楚、明了,含义准确,防止注释二义性。避免在注释中使用缩写,特别是非常用缩写。注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。变量注释和变量在同一行,所有注释必须对齐,与变量分开至少两个Tab键。程序段或语句的注释在程序段或语句的上一行。注释与所描述内容进行同样的缩排。重要变量必须有注释。典型算法必须有注释。在循环和逻辑分支的地方必须写上注释。避免在一行代码或表达式的中间插入注释。在代码交付之前,必须删掉临时的或无关的注释。模块注释在一个程序模块的开始,应用注释说明模块的名字、功能、开发者和日期和版本变更历史,如下所示:////Name: ChargeUser//Function: Chargecreditsfromtheuseraccountandsaveittotheuser،¯saccount//Author: AuthorName//Date: Aug.8,2021////ChangeHistory://Date Who ChangesMade////2021-5-1 Author1 Initialcreation//2021-5-15 Author2 AddbStatusvariabletoidentifyUser،¯sstate//2021-7-3 Author3 AddCheckBlackList()tocheckwhetheruser// isinblacklist//类的注释在定义一个类之前,应用“///”注释说明类的功能、使用方法和特殊的属性,如下所示:///<summary>///Thisclasscontainsthebusinessfacadefortheordersystem.///<remarks>///Thebusinessfacadeisusedtoprovideasimplifiedinterfaceintothe///ordersubsystems.///</remarks>//////<remarks>///ThisclassismarkedasMarshalByRefObjecttosupportremotedscenarios.///</remarks>///</summary>publicclassOrderSystem:MarshalByRefObject{}须注意的是,我们要遵从VS.NET对注释的约定,使用<summary>标记来指定类总体注释的开始,用</summary>标记它的结束。对类的一些注解说明可以放在<remarks>和</remarks>对中。以后我们可以从这些注解自动得到对代码的说明文档。如下例所示:Duwamish7.BusinessFacade.OrderSystemClassThisclasscontainsthebusinessfacadefortheordersystem.Thebusinessfacadeisusedtoprovideasimplifiedinterfaceintotheordersubsystems.ThisclassismarkedasMarshalByRefObjecttosupportremotedscenarios.Access:PublicBaseClasses:MarshalByRefObject

MembersDescription

GetOrderSummaryFillsintheordersummarydataforanorder.Theorderthatisbeingworkedon.UpdatedOrderDataobject.Thisisreturnedtosupporttheremotedscenario(OrderDataisaMarshalByValueobject).class='System.ApplicationException'>Theorderisnull.

AddOrderAddanorderandreturnthetransactionid.Theorderthatisbeingworkedon.Theorderthathasjustbeenadded.class='System.ApplicationException'>Theorderisnull.

Remarks:Thebusinessfacadeisusedtoprovideasimplifiedinterfaceintotheordersubsystems.ThisclassismarkedasMarshalByRefObjecttosupportremotedscenarios.类成员方法的注释在定义类成员方法前,应说明该过程/函数的名字、功能、输入/输出和版本变更历史,如下所示:///<summary>///Fillsintheordersummarydataforanorder.///<paramname="order">Theorderthatisbeingworkedon.</param>///<retvalue>UpdatedOrderDataobject.///<remarks>///Thisisreturnedtosupporttheremotedscenario(OrderDataisa///MarshalByValueobject).///</remarks>///</retvalue>///</summary>////ChangeHistory://Date Who ChangesMade//2021-5-1 Author1 Initialcreation//2021-5-15 //publicOrderDataGetOrderSummary(OrderDataorder){}在这里“<paramname="<参数名>">”和“</param>”指明方法的参数的描述信息;“<retvalue>”和“</retvalue>”对说明了方法返回值的特性。由这些注解自动得到的说明文档如下所示:Duwamish7.BusinessFacade.OrderSystem.GetOrderSummaryFunctionFillsintheordersummarydataforanorder.Theorderthatisbeingworkedon.UpdatedOrderDataobject.Thisisreturnedtosupporttheremotedscenario(OrderDataisaMarshalByValueobject).PublicOrderDataGetOrderSummary(OrderData)

TypeNameDescription

OrderDataorderTheorderthatisbeingworkedon.

ReturnDescription

OrderData

Remarks:Thisisreturnedtosupporttheremotedscenario(OrderDataisaMarshalByValueobject).类成员属性、常量、变量的注释在定义类成员属性前,应描述该属性,如:///<summary>///档案编号///</summary>public String DonorID;对于模块级的常量、变量应该象类成员属性一样写注释。程序注释在代码实现时,应对其目的和实现的功能进行说明,其要点是:采用了特殊的语法需要对语法注释;为实现部分功能需要注释;不能通过上下文立即明白其功能需要注释。如下例所示:publicOrderDataGetOrderSummary(OrderDataorder){////Checkpreconditions//ApplicationAssert.CheckCondition(order!=null,"Orderisrequired",ApplicationAssert.LineNumber);////CalculatesubTotal//DecimalsubTotal=0;……代码书写规范排版规范程序块要采用缩进风格编写,在某些情况下,代码需要有适当的缩进,缩进的空格数为4个。说明:对于由开发工具自动生成的代码可以有不一致。相对独立的程序块之间、变量说明之后必须加空行。示例:如下例子不符合规范。if(isValid){...//programcode}Testt=newTest();应如下书写if(isValid){...//programcode}Testt=newTest();较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。示例:inttest=aaaaaaaaaaaaaa+bbbbbbbbbbbbbbb;循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。示例:if((test<MAX_TEST_NUMBER)&&(IsValidMethod(testBool))){...//programcode}for(i=0,j=0;(i<MAX_TEST_NUMBER)&&(j<test.length);i++,j++){...//programcode}若方法的参数较长,则要进行适当的划分。示例:publicvoidTestMethod(stringa,stringb,stringc,stringd,stringe);不允许把多个短语句写在一行中,即一行只写一条语句。示例:如下例子不符合规范。rect.length=0;rect.width=0;应如下书写rect.length=0;rect.width=0;if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。示例:如下例子不符合规范。if(user==NULL)return;应如下书写:if(user==NULL){return;}对齐只使用空格键,不使用TAB键。说明:以免用不同的编辑器阅读程序时,因TAB键所设置的空格数目不同而造成程序布局不整齐。方法的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从语句缩进要求。示例:publicvoidTestMethod(){...//programcode}程序块的分界符(如大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。示例:如下例子不符合规范。for(...){...//programcode}if(...){...//programcode}voidTestMethod(){...//programcode}应如下书写。for(...){...//programcode}if(...){...//programcode}voidTestMethod(){...//programcode}在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格。说明:采用这种松散方式编写代码的目的是使代码更加清晰。由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为括号已经是最清晰的标志了。在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。示例:(1)逗号、分号只在后面加空格。inta,b,c;(2)比较操作符,赋值操作符"="、"+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位操作符"<<"、"^"等双目操作符的前后加空格。if(i>=VALUE)a=b+c;a+=2;a=b^2;(3)"!"、"~"、"++"、"--"等单目操作符前后不加空格。flag=!isEmpty;//非操作"!"与内容之间i++;//"++","--"与内容之间(4)if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。if(a>=b&&c>d)一行程序以小于80字符为宜,不要写得过长。成员比较多、代码量较大的类中,为了使代码更容易阅读,应适当使用#region…#endregion将同类型的代码加以分隔显示或隐藏。示例:#region属性...//programcode#endregion#region私有方法...//programcode#endregion类成员使用规范属性使用指南使用Pascal风格来命名属性publicclassFoo{publicColorBackColor{}}不要使用匈牙利命名法.建议不要使用相同的类的属性名字和类型名字.将一个类的属性名定义成与某个类型(Type)的名字相同会在某些编程语言中引起二义性.最好避免这种二义性除非由非常正当的理由去这么做。例如:类有一个Icon属性,虽然也有一个Icon类但由于这个名字比或这样的类属性名更容易理解,所以我们仍采用Icon属性名.但是在System.WinForms.类中有一个颜色属性.由于已经有了一个Color类,这个类的颜色属性就被命名为BackgroundColor.这是一个更有意义的命名且与已经存在的类的名字不冲突.当对一个类中属性作赋值操作时发生了异常(Exception)时,一定要保证这个属性中还保留着以前保存的属性值。避免这个属性的内容处于不确定状态.必须允许类的属性可以以任意的顺序赋值.属性与其他属性间应该是没有状态关系的.通常情况下只有当程序对一组属性作了赋值之后,这个对象的某个功能才会被激活,或者只有当这个对象在一些正确的状态下,这个功能才会起作用.而且当对象进入此状态时,这个功能会被自动激活而无需任何其他的显示(Implicit)调用.例如一个TextBox有两个相关的属性:DataSource和DataField.DataSource指明了数据表名,而DataField指明了相应的类属性名.一旦这两个属性被指明后,这个控件就会把数据表中相应的数据取出赋给这个控件的Text属性.下面的例子演示了我们可以以任意的顺序设置控件的属性.TextBoxt=newTextBox();t.DataSource="Publishers";t.DataField="AuthorID";//Thedatabindingfeatureisnowactive.上面的代码是与下面的程序等效的.TextBoxt=newTextBox();t.DataField="AuthorID";t.DataSource="Publishers";//Thedatabindingfeatureisnowactive.此外,程序员可以将一个属性设为null,指明这个属性是未赋值的.TextBoxt=newTextBox();t.DataField="AuthorID";t.DataSource="Publishers";//Thedatabindingfeaturenowactivet.DataSource=null;//Thedatabindingfeatureisnowinactive下面的例子演示了如何做到对属性的赋值顺序复关,并检查数据绑定的状态并在适当的时候自动激活相应的功能.publicclassTextBox{stringdataSource;stringdataField;booleanactive;publicstringDataSource{ get{returndataSource;}set{if(value!=dataSource){//Updateactivestate.SetActive(value!=null&&dataField!=null);dataSource=value;}}}publicstringDataField{get{returndataField;}set{if(value!=dataField){//Updateactivestate.SetActive(dataSource!=null&&dataField!=null);dataField=value;}}}voidSetActive(booleanvalue){if(value!=active){if(value){Activate();Text=dataBase.Value(dataField);}else{Deactivate();Text="";}active=value;//setactiveonlyifsuccess}}voidActivate(){//opendatabase}voidDeactivate(){//closedatabase}}只读和只写的属性当在逻辑上要求用户不能改变类的属性时,需要使用只读属性.禁止使用只写属性.事件使用指南使用Pascal风格来命名事件.不要使用匈牙利命名法.应该使用"raise”(“产生”)术语来表示产生事件而不是使用"fire"或“trigger”.当在文档中描述事件时,应该使用"aneventwasraised"而不是"aneventwasfired"或“aneventwastriggered.”应考虑用动词来命名一个事件.事件处理程序应返回void值.例如:publicdelegatevoidMouseEventHandler(objectsender,MouseEventArgse);因该从类中派生出事件处理数据类。例如:publicclassMouseEventArgs:EventArgs{}应该假设在事件处理过程中会发生任何事情(要注意异常处理).类应该准备事件处理过程会修改任何的事物,而且需要保证在事件被生成时所有的对象都处于一个合法的状态.应该考虑使用try/finally程序块在事件产生的地方.由于程序员调用了callback函数在这个对象上执行操作,就不应该在程序控制返回后对程序状态做任何假设.例如:publicclassButton{ButtonClickHandleronClickHandler;protectedvoidDoClick(){PaintDown();//paintbuttonindepressedstatetry{OnClick();//calleventhandler}finally{//windowmaybedeletedineventhandlerif(windowHandle!=null){PaintUp();//paintbuttoninnormalstate }}}protectedvirtualvoidOnClick(ClickEvente){if(onClickHandler!=null)onClickHandler(this,e);}}方法使用指南使用Pascal风格来命名事件.不要使用匈牙利命名法.缺省使用非虚函数的方法.方法重载指南当一个类中有两个同名的方法可以使用,只不过他们有不同的调用参数时,我们需要方法重载.(源码网资料下载:)当你要在类中提供两个不同的方法而他们的语意相同时,应该使用方法重载.用重载来实现方法的缺省参数。(缺省参数这种方法无法很好地翻译,因此在通用语言规范CLS中是不允许的).intString.IndexOf(Stringname);intString.IndexOf(Stringname,intstartIndex);当参数个数是变化的时候应该使用方法重载.当一个方法接受的参数个数必须是可变的时候,我们可以通过重载定义N个参数个数渐长的方法来解决,同时还提供一个重载的方法跟随一个数组参数(为参数个数大于N的客户).N=3orN=4是一个比较适合的方法.例如:publicclassFoo{publicvoidBar(stringa){Bar(newstring[]{a});}publicvoidBar(stringa,stringb){Bar(newstring[]{a,b});}publicvoidBar(stringa,stringb,stringc){Bar(newstring[]{a,b,c});}publicvirtualvoidBar(string[]args){//coreimplementationhere}}可变长度参数你可以希望提供一个方法可以接受不定个数的参数(比如像C语言的printf函数).对于受管理的代码,我们可以用ParamsAttribute模式来构造这种结构.例如,你可以用下面的代码来代替多个重载的方法.voidFormat(stringformatString,paramsobject[]args)你不能使用VarArgs式的调用规范(…)来实现不定个数的参数,这是应为通用语言规范(CLS)不支持它.构建函数使用指南只有当一个类中仅有静态的方法和属性时,我们才能使用私有的构造方法.publicsealedclassEnviroment

{

privateEnviroment();//Preventstheclassfrombeingcreated.

//…

}在构造函数中尽量做最少的工作.多余的功能应该留到后续的代码中,当客户代码调用这个功能时在座相应的工作。建议不要在“struct”(valuetypes)中定义一个空的构造函数.如果一个结构没有构造函数,CLR运行时就会自动将结构的所有成员属性设为0.这能够提高数组或结构初始化的速度.类的成员变量使用指南不要将类成员变量设为外界可直接访问的.应考虑提供get和set的成员存取方法来代替将成员变量设为public.publicstructPoint{privateintx;privateinty;publicPoint(intx,inty){this.x=x;this.y=y;}publicintX{get{returnx;}set{x=value;}}publicintY{get{returny;}set{y=value;}}}如要将一个成员变量提供给继承的子类,应该使用一个aprotected(family)的方法返回这个成员的值.publicstructControl:Component{privateinthandle;protectedintHandle{get{returnhandle;}}}通过避免将成员变量直接暴露给开发者,类可以更容易地被改写:一个成员变量能可以被改成一个属性而同时又能维持二进制兼容.对类成员的访问方法get和set能允许日后对类的改进,比如根据对类属性的调用按需创建对象,或是添加属性修改的事件处理.避免在类成员的名字中使用缩写.classFoo{stringurl;stringdestinationUrl;}不要使用匈牙利命名法.好的名字应该描述语法而不是类型.参数名称指南一定要对参数作校验.在每个公共的方法或属性的setaccessor内应该对输入参数的合法性作检验。若发现有误应该抛出有意义的异常给程序员.在这里应该使用异常或它的子类.classFoo{publicintCount{get{returncount;}set{if(count<0||count>=MaxValue)thrownewArgumentOutOfRangeException( Sys.GetString( "InvalidArgument", "value", count.ToString() ));}}publicvoidSelect(intstart,intend){if(start<0)thrownewArgumentException( Sys.GetString( "InvalidArgument", "start", start.ToString() ));if(end<0)thrownewArgumentException(Sys.GetString( "InvalidArgument", "end", end.ToString()));}}类型使用指南类型是在运行时封装的单元.有三种基本的类型.类类是最基本的一种通用类型。类可以是抽象的或密封的。抽象类需要子类来实现相应的方法.密封的类不允许被继承.值类型值类型代表一系列存储在堆栈中的二进制值.接口类型一个接口类型是对值的部分描述,它可以被许多对象类型所支持.类使用指南尽量使用类代替其他类型.在别的类型系统中(比如COM就过分依赖于接口)。在被管理的运行环境中,类应该是最普遍使用的类型.基类使用指南基类是将一组有共同功能的对象组织起来的非常有用的方法。基类可以提供一组缺省的功能,而同时又允许扩展和定制.只有当你有一个非常明确的用户场景时,才应该在设计中加入对象的扩展和多态等功能.例如,给数据适配器提供一个Interface(IDataAdapter)是非常困难且没有真实意义的:你依然没有一个程序是基于这些特定接口的,提供一个接口仅有一些边缘性的好处.然而,我们必须保证所有数据适配器的一致性.虽然一个接口或抽象类在这里并不一定恰当,但一个模式非常重要.建议你使用基类.从一个多版本的角度,接口没有类灵活.基于一个类,你可以发布它的1.0版然后在版本2.0中加入新的方法.只要这个新的方法不是抽象的,所有已有的从这个基类继承的子类都能够继续工作而无需改变.由于接口不支持实现继承,上面适用于类的模式无法作用在接口上.在接口中加入新方法等于是在基类中加入新的抽象方法:由于所有实现这个接口的类都没有实现此新方法,他们都被破坏了.接口适用于下列条件下:多个不相关的类必须支持同一个协议.这些类已经有了基类(forexample,someareUIcontrols,someareWebservices),而c#中是不支持多重继承的.这个时候我们需要使用接口。实际情况不适合使用聚合.对于其他的情况,类的继承是一个更好的模式.比如,将IByteStream定义为一个接口那么一个类就能实现多个流类型.而将ValueEditor定义成一个抽象的基类是因为从ValueEditor继承的子类除了editvalues外没有其他的功能.值类型使用指南结构使用指南在如下的情况中,建议使用struct类型来满足要求.只作为简单的类型.类型实例的大小要在16个字节以下.类型是不可变的.值类型是更符合要求的.publicstructInt32:IComparable,IFormattable{publicreadonlyconstintMinValue=-2147483648;publicreadonlyconstintMaxValue=2147483647;publicstaticstringToString(inti);publicoverridestringToString();publicstaticintParse(strings);publicoverrideintGetHashCode();publicoverrideboolEquals(objectobj);publicvirtualintCompareTo(objectobject);}不要在结构类型中提供一个缺省构造函数.运行时环境会自动加入一个构造函数将所有的值初始化为0.这在实例化结构数组时能够大大提高效率..枚举使用指南Do应该使用枚举类型来作为强类型的参数,属性和返回值.这样程序会更有意义且很难出错。同时在参数或属性中使用枚举类型(enum)可以让开发工具知道这个属性或参数所有的可能值,从而自动提示给程序员。这样可以提高开发的效率.publicenumSpecialFolder{ApplicationData,

温馨提示

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

评论

0/150

提交评论