C#编码规范.doc_第1页
C#编码规范.doc_第2页
C#编码规范.doc_第3页
C#编码规范.doc_第4页
C#编码规范.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

中国人寿保险股份有限公司版权所有,不得侵犯中国人寿保险股份有限公司标准C#编码规范(2011版) 中国人寿保险股份有限公司信息技术部 发布文档信息制度名称C#编码规范密级分类三类公司制度C类信息技术制度密级分类三类公司制度C类信息技术制度实施目标规范C#语言开发的编码习惯和风格主题词C# 编码 规范版本控制版本日期人员更新说明2011版2011年5月傅纪东新增文档审核审核人职务审核日期第2页1 概述1.1 目的C#编码规范作为使用C#语言进行程序开发的规范,详细描述了C#语言开发中命名、声明、语句、注释、排版等的规范,并对编程惯例进行约束,用于指导使用C#语言进行开发的项目进行代码规范和检查。同时还对为安全性规范和单元测试提供指导。1.2 适用范围本规范适用于公司全系统。1.3 术语定义C#:是由MicroSoft公司推出的C#程序设计语言,是和.NET平台的总称中主要的开发语言之一。2 编码规范2.1 排版规范1)缩进、换行、空行程序块要采用缩进风格编写,缩进的空格数为4 个。1函数或过程的开始、结构的定义代码采用缩进风格。2循环和判断语句(if、for、foreach、do、while、switch、case 等)中的代码采用缩进风格。3一行代码的长度不能超过屏幕显示范围(一般控制在80 个字符以内)。4长的语句要分成多行书写。5长表达式要在低优先级操作符处划分新行。6函数或过程中的参数较长时,要分成多行书写。7多行书写时,串连运算符要放在新行之首。8相对独立的程序段、变量之后要加空行。10在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符,后不应加空格。2)排版结构1 不允许把多个短语句写在一行中,即一行只写一条语句。但if、for、foreach、while 等语句后的不单独占用一行,可以使行数减少,让一个窗口视图可以看到更多的逻辑。2 不同类型的操作符混合使用时,即时即使实现优先级与实际需要相符,最好也使用括号隔离之,以便代码更加清晰。2.2 变量规范1) 变量的使用1仔细定义并明确变量的含义、作用、取值范围及变量间的关系。2变量访问之前一定要初始化。3C#中没有全局变量,和全局函数。全局的方式的操作是通过静态变量和静态函数来实现的。4readonly(只读)修饰符,仅在类的数据成员中使用,只能在构造函数或者直接初始化下时赋值一次。与const数据成员不同的事是,const 要求在声明中初始化,而readonly 可以先定义,后作赋值(仅一次)。2)数据类型数据结构1使用严格形式定义的,、可移植的数据类型,尽量不要使用与具体硬件或软件环境关系密切的变量。2不要设计面面俱到、非常灵活的数据结构。不同结构间的关系不要过于复杂。结构中元素的个数应适中。3若结构中元素个数过多,可考虑依据某种原则把元素组成不同的子结构,。4仔细认真设计结构中元素的布局与排列顺序,使结构容易理解,并以减少引起误用现象。5留心注意具体语言及编译器处理不同数据类型的原则及有关细节。编程时,要注意数据类型的强制转换。对编译系统默认的数据类型转换,也要有充分的认识。6尽量减少没有必要的数据类型默认转换与强制转换。对自定义数据类型进行恰当命名,使它成为自描述性的,以提高代码可读性。注意其命名方式在同一产品中的统一。7用户定义的类型可以包括:类类型(class),结构类型(struct),接口类型(interface)。根据类型的内存分配形式的不同又分成 值类型(value types),引用类型(reference types)。8在对较长字符串操作的时候,避免使用String 类,而用效率比较高的StringBuilder 类,可以提高操作的便利性,减少额外开销和垃圾回收的压力。2.3 命名规范1)变量、方法函数的命名1变量名必须以字母为开头2变量名只能由字母,、数字和下滑线组成,而不能包含空格,、标点符号,、运算符等其他符号。3变量名不能与C#中的关键字,、库函数名称相同。4关于变量命名类型,形式可参考如下。类型 命名形式 特征Bool bFlag true;falseChar cName 数字,英文,表达式符号Sbyte sbCount 有符号8 位整数byte bCount 无符号8 位整数short sCount 有符号16 位整数ushort usCount 无符号16 位整数int nCount 有符号32 位整数uint niCount 无符号32 位整数long lCount 有符号64 位整数ulong ulCount 无符号64 位整数float fCount 单精度7 位数decimal dCount 双精度15 到16 位数string sName 字符串5命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使让人产生误解。而且完整的单词之间的第一个字母需用大写来区别。6关于变量的级别区分。私有成员变量:变量前缀”m_”;静态成员:变量前缀”s_”。7i、j、k 作局部循环变量是允许的,x,y 经常被作为坐标变量。8方法函数的命名要避免使用容易被主观解释的难懂的名称,使用动词-名词的方法来命名来给定。读不懂9对于区分变量和方法函数,对方法函数名要使用Pascal 大小写处理(CalculateInvoiceTotal),其中每一个单词的第一字母都是大写;对于变量名要使用camel 大小写处理(documentFormatType),其中除了第一个单词以外每个单词的第一个字母都是大写的方式来处理。2) 常量、宏定义命名1常量和宏定义必须要有一定的实际意义。2常量和宏定义在函数定义之前。3常量和宏定义必须全部以大写字母来命名,中间可以根据意义连续性用下划线连接。而且在右边必须要有注释来说明其意义和作用。3)类、委托、接口、名空间的命名1以Class 声明的类,的都必须以能够标识事物特性的名词或者名词短语命名,每个单词的第一个字母必须大写。2根据一些类的特性(命名 + 特性标识)来命名,参考如下。s特性 标识Attribute AttributeException Exception只需要一个对象实例(全局对象) Class只作为其他类的基类 Base类是窗体 Form类是Web窗体 Page3委托类型以描述动作的名词命名,以体现委托类型实例的功能。4接口的命名以大写字母“I”加上有意义的单词命名来命名,每个单词的第一个字母必须大写。接口以外的命名,一定要避免使用“I”作为单个单词首写的命名。5名字空间的命名,参照类命名。4)控件、资源名称命名1Web 控件的命名以(“Web 控件大写前缀 + “_” + 变量名称“)来规范。控件 大小写前缀Frame FrmLabel LblTextBox TxtCheckBox ChkButton BtnListBox LstDropDownList DrpImage ImgPicture PicGrid GrdComBox Cob2WindowsForm 的控件命名以(“Windows 控件小写前缀 + “_”_ + 变量名称)“来规范。控件 小写前缀Fram frmLabel lblTextBox txtCheckBox chkButton btnListBox lstDropDownList drpImage imgPicture picGrid grdComBox cob3资源名称命名以(“资源大写前缀 + “_”_ + 变量名称)“来规范。控件 大写前缀菜单 IDM位图 IDB对话框 IDD字符串 IDS2.4 注释规范1)模块(类)注释文件开始注释内容包括:公司名称、版权、作者名称姓名、时间、模块用途、背景介绍等,复杂的算法需要加上流程说明。/* 文件(类)名:* Copyright (c) 2003-2004 *公司* 创建人:* 日 期:* 修改人:* 日 期:* 描 述:* 版 本:*/2)函数注释函数注释包括:输入、输出、函数描述、流程处理、调用样例等,复杂的函数需要加上变量用途说明。函数注释包括:输入、输出、函数描述、流程处理、调用样例等,复杂的函数需要加上变量用途说明。/* 函数名:* 输 入: a,b,c* a-* b-* c-* 输 出: x-* x 为 1, 表示.* x 为 0, 表示.* 功能描述:* 调用模块:* 作 者:* 日 期:* 修 改:* 日 期:* 版 本:*/3)代码注释1变量,、常量的注释。包括:简洁准确的注释。2程序中的功能块。,包括:修改时间和作者、方便理解的注释等。3边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。4不再有用的注释要删除。注释的内容要清楚、明了、含义准确,防止注释二义性。5避免在注释中使用缩写,特别是非常用缩写注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。6对于所有物理含义的变量、常量,如果其命名不是充分注释的,在声明时都必须加以注释,说明其物理含义、变量、常量、宏的注释就放在其上方相邻位置或右方。7数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分注释的,必须加以注释。8对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。9. 描述内容进行同样的缩排.。将注释与其上面的代码用空行隔开。10.对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。2.5 结构化规范1)程序结构要求1程序结构要清晰,简单易懂,单个函数的程序行不得超过200 行。2使用.NET 库函数和公共函数(无特殊情况,不要使用外部方法调用windows 的核心动态连接库)。3代码中垂直对齐左括号和右括号。4在函数参数较多的时候,尽量使用结构类型来传递参数。2)可读性规范1要重视程序的可读性,并在其基础上考虑效率。2保持代码和注释的一致性。3运算符两边要有空格。4在复杂的算法前面,必须要有详细解释。5循环和分层不要超过5 层。3)结构化规范1禁止GOTO 语句。2用IF 语句来强调只执行两组语句中的一组。禁止ELSE GOTO 和 ELSE RETURN 的使用。3不提倡使用条件赋值语句。4不要轻易使用条件分支去替换逻辑表达式。2.6 代码正确性规范1)代码规范1有变量在调用前,必须初始化。2对所有用户的输入,必须作做合法性检查。3不要比较浮点数的相等。4程序与环境或状态发生关系时,必须主动去处理发生的意外事件。5尽量使用规范的容错语句。trycatchfinally6注意装箱和拆箱方法的使用。7注意隐性类型转换的值的变化。2) 可复用性规范1重复使用完成相对独立功能的算法或者代码,应抽象为 服务或类。2尽量用OO 思想考虑独立和封装性。3 安全性规范3.1 输入验证类规范1、避免命令注入类攻击避免从系统目录获取外部执行程序,通过cmd方式执行;String home = System.getProperty(APPHOME);String cmd = home + INITCMD;C#.lang.Runtime.getRuntime().exec(cmd);命令注入攻击通过改变应用程序执行的命令和改变命令执行的环境达到攻击目的。攻击者可以通过修改系统变量APPHOME,使其指向一个包含恶意代码的路径,进而利用应用程序的高级权限来执行任意命令。因为程序没有对读入的环境变量值进行验证,如果攻击者能够控制系统的环境变量值APPHOME,那么攻击者就能欺骗应用程序,让其执行恶意代码,从而控制系统。2、避免跨站脚本攻击应用程序在数据库或者其它可信数据源中存储了危险数据。这些危险数据随后被应用程序读取并包含在动态内容中。存储型XSS 通常是由攻击者将危险内容注入数据存储中,然后该内容被读出并包含在动态内容中。必须在所有数据进入应用程序之前把可能的危险拦截。针对非法的HTML 代码包括单双引号等,编写函数对其进行过滤。3、避免拒绝服务攻击涉及到系统资源的外部数据应该进行严格校验,防止大数目或者无限制的输入。4、避免路径操控攻击应用程序应该尽量避免用户直接指定文件系统操作路径,可以通过文件选择框或者文件列表来让用户指定操作路径,同时对用户指定的路径进行输入校验,对不符合程序要求的拒绝执行。对于来自于配置文件等外部资源的路径输入,同样应该进行输入校验,防止外部输入路径非法或者越界5、避免日志伪造应用程序应该避免将用户的输入直接记入日志,可以根据产生的异常,在程序内部生成日志信息记入日志。如果需要将来自于外部的数据记入日志,那么需要对记入日志的数据进行校验,过滤非法字符。此外,应该对日志文件进行严格的访问控制,杜绝未经授权的用户访问日志。6、避免SQL注入应用程序对输入进行验证,要么只接受白名单中的安全字符,要么鉴别和排除黑名单中的恶意字符。白名单是一种非常有效的方法,虽然它需要执行严格的输入验证规则,但可以减少对参数化SQL 语句的维护,并能够提供更高的安全保证。3.2 API使用规范1、避免使用GC.Collect()直接请求进行垃圾回收很有可能导致出现问题,尤其是与时间和状态有关时。2、检测函数返回值的空值程序要对函数的返回值进行非 Null 校验,否则程序有可能会去解引用一个空指针。3、遵循对象模型,定义Equals()和GetHashCode()(类重写 Equals()方法和GetHashCode()方法。.NET 对象需要满足很多与相等有关的等式,其中一个等式就是相等的对象要有相等的hash 值。换句话说,如果a.Equals(b) = true,那么a.GetHashCode() = b.GetHashCode()。如果该类的对象被存储在一个 c

温馨提示

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

评论

0/150

提交评论