1、编 程 规 范本规范适用于研发中心基于 C#语言的编程应用。1 基本原则 1、程序结构清晰,简单易懂。2、代码精简,避免垃圾程序。3、尽量使用标准库函数和公共函数。4、谨慎使用全局变量,尽量使用局部变量。5、重视代码注释,对于关键代码必须进行注释说明,具体注释要求见规范。6、除约定俗成外,尽量不用缩写。 7、除用于循环,不要使用单个字母的变量。8、类模块必须明确构造函数应完成什么工作。9、必须设置足够的错误陷阱,防止进程的异常终止。10、重复使用的完成相对独立功能的算法或代码应抽象为公共控件或类。11、公共控件或类应考虑 OOP 思想,减少外界联系,考虑独立性或封装性。12、尽量保证每个类定义
2、在不同文件。2 排版1、代码列宽控制在 110 字符左右。2、单个函数的程序行数原则上不超过 100 行。3、在一段相对独立的功能代码、或者函数、属性之间插入空行。4、较长的语句(超出列宽)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。5、若函数或过程中的参数较长,则要进行适当的划分。6、程序块要采用缩进风格编写,缩进为一个 TAB(统一为 4 个空格) ,不要在代码中使用 Tab 字符。Visual Studio.Net 设置:工具-选项-文本编辑器-C#-制表符-插入空格。7、除非密切相关,否则不允许把多个短语
3、句写在一行中,即一行只能写一条语句。8、if、for、do、while、case、switch、default 等语句自占一行,且if、for、do、while 等语句后一定要使用,即使号中为空或只有一条语句。9、函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case 语句下的情况处理语句也要遵从语句缩进要求。3 注释1、边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。2 、在部署发布之前,移除所有临时或无关的注释,以避免在日后的维护工作中产生混乱。3、注释的内容要清楚、明了,含义准确,防止注释二义性。4、注释与所描述内容进
4、行同样的缩排。5、将注释与其上面的代码用空行隔开。6、在每个文件头必须包含以下注释说明,/*- / Copyright (c) 2006-2010 *公司技术开发部/ 文件名:/ 文件功能描述:/ / 创建标识: / 修改标识: / 修改描述:/ 修改标识: / 修改描述:/-*/ 文件功能描述只需简述,具体详情在类的注释中描述。创建标识和修改标识由创建或修改人员的全拼音加日期组成。如:XuYanJun20070404。一天内有多个修改的只需做一个在注释说明中做一个修改标识就够了。在所有的代码修改处加上修改标识的注释。7、接口、类、方法、属性、字段等注释使用/三斜线注释,这种注释是基于 XML
5、 的,不仅能导出 XML 制作帮助文档,而且在各个接口、类、方法、属性、字段等的使用中,编辑环境会自动带出注释,方便你的开发。如:/MyMethod is a method in the MyClass class./Heres how you could make a second paragraph in a description./ /for information about output statements./public static void MyMethod(int Int1)8、对于不再使用的代码或临时测试屏蔽某些代码注释时采用以下格式:/*修改标识修改原因. . . (
6、the source code )*/9、变量特别是全局变量所使用的值域需标识,除非变量名定义已十分明确了语义及值域。如:blnIsDbConnected 源于值域、语义明确的“Is Database connected or not?”, (其他的如:strPassword,intWorkID 等)则无需标注,但intDeviceState 语义明确,值域不明,则应中(英)文注明,如:0-Normal,1-No communication response,2-communication error(maybe checksum error),如果采用位标识,则 value=0-Normal
7、,bit0- No communication response,bit1-communication error(maybe checksum error)。4 申明1、尽可能在变量声明时就对其做初始化(就近原则) 。 2、变量尽可能置于块的开始处,不要总是在第一次使用它们的地方做声明。如void MyMethod()int int1 = 0; / beginning of method blockif (condition)int int2 = 0; / beginning of “if“ block.不过也有一个例外: for (int i = 0; i maxLoops; i+).应避
8、免不同层次间的变量重名,如:int count;.void MyMethod()if (condition)int count = 0; / 避免.3、不要使用 public 或 protected 的实例字段。考虑为字段提供 get 和 set 属性访问器,而不是使它们成为公共的。get 和 set 属性访问器中可执行代码的存在使得可以进行后续改进,如在使用属性或者得到属性更改通知时根据需要创建对象。下面的代码示例阐释带有 get 和 set 属性访问器的私有实例字段的正确使用。示例:public class Control: Componentprivate int handle;publ
9、ic int Handleget return handle; 5 命名规则5.1 命名方法编程的命名方式主要有 Pascal 和 Camel 两种(Pascal:每个单词的首字母大写,例如 ProductType;Camel:首个单词的首字母小写,其余单词的首字母大写,例如productType) 。常用的 C#成员及其命名方法定义如下:标志符 规则 实例与描述类 class Pascal Application枚举类型 enum Pascal委托 delegate Pascal 以 Pascal 命名,不以任何特殊字符串区别于类名、函数名常量 const 全部大写 全部大写,单词间以下划线
10、隔开接口 interface Pascal IDisposable 注:总是以 I 前缀开始,后接 Pascal命名方法 function Pascal 有返回值的方法的命名中要有返回值的描述,例如GetObjectState()参数 Camel 首字母小写局部变量 Camel 也可以加入类型标识符,比如对于 String 类型变量写为:strSQ数据成员 Camel 以 m 开头Pascal 命名规则,如mProductType(m 意味 member)属性 Pascal5.2 命名空间1、命名命名空间时的一般性规则是使用公司名称,后跟技术名称和可选的功能与设计,如下所示:CompanyNa
11、me.TechnologyName.Feature.Design例如:namespace SCTD.iScope.VD /上海交技公司的 iScope 软件的 VD 设备模块2、命名空间使用 Pascal 大小写,用逗号分隔开。3、TechnologyName 指的是该项目的英文缩写,或软件名。4、命名空间和类不能使用同样的名字。例如,有一个类被命名为 Debug 后,就不要再使用 Debug 作为一个名称空间名。5.3 变量命名用小写字母的前缀表示变量的类型,前缀的下一个字母用大写。变量类型 缩写格式 标准命名举例Array arr arrShoppingListBoolean bln bl
12、nIsPostBackByte byt bytPixelValueChar chr chrDelimiterDateTime dtm dtmStartDateDecimal dec decAverageHeightDouble dbl dblSizeofUniverseInteger int intRowCounterLong lng lngBillGatesIncomeObject obj objReturnValueShort shr shrAverageSingle sng sngMaximumString str strFirstName5.4 控件命名用小写前缀表示类别,具体命名方法
13、如下表所示。控件名 控件名简写 标准命名举例 Button btn btnSubmit Label lbl lblResults TextBox txt txtFirstName CheckBox chk chkBlue RadioButton rad radFemale ListBox lst lstCountries CheckBoxList chkl chklstFavColors RadioButtonList radl radlGender DropDownList drop dropCountries Image img imgAuntBetty Calendar cal calM
14、ettingDates CompareValidator valc valcValidAge CustomValidator valx valxDBCheck DataGrid dgrd dgrdTitles DataList dlst dlstTitles HyperLink lnk lnkDetails ImageButton ibtn ibtnSubmit LinkButton lbtn lbtnSubmit Panel pnl pnlForm2 RangeValidator valg valgAge RegularExpression vale valeEmail_Validator
15、Repeater rpt rptQueryResults RequiredFieldValidator valr valrFirstName Table tbl tblCountryCodes TableCell tblc tblcGermany TableRow tblr tblrCountry ValidationSummary vals valsFormErrors XML xmlc xmlcTransformResults 5.5 类1、使用 Pascal 大小写。2、用名词或名词短语命名类。3、使用全称避免缩写,除非缩写已是一种公认的约定,如 URL、HTML。4、不要使用类型前缀,
16、如在类名称上对类使用 C 前缀。例如,使用类名称 FileStream,而不是 CFileStream。 5、不要使用下划线字符 (_)。 6、有时候需要提供以字母 I 开始的类名称,虽然该类不是接口。只要 I 是作为类名称组成部分的整个单词的第一个字母,这便是适当的。例如,类名称 IdentityStore 是适当的。在适当的地方,使用复合单词命名派生的类。派生类名称的第二个部分应当是基类的名称。例如,ApplicationException。类定义示例如下:public class FileStreampublic class Button5.6 接口1、用名词或名词短语,或者描述行为的形容词命名接口。例如,接口名称 IComponent 使用描述性名词。接口名称 ICustomAttributeProvider 使用名词短