C#编码规范.docx
《C#编码规范.docx》由会员分享,可在线阅读,更多相关《C#编码规范.docx(37页珍藏版)》请在冰豆网上搜索。
C#编码规范
中国人寿保险股份有限公司版权所有,不得侵犯
中国人寿保险股份有限公司标准
C#编码规范
(2011版)
中国人寿保险股份有限公司信息技术部发布
第1页
中国人寿保险股份有限公司版权所有,不得侵犯
文档信息
制度名称
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.相对独立的程序段、变量之后要加空行。
C#编码规范4/24
10.在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符,后不应加空格。
2)排版结构
1.不允许把多个短语句写在一行中,即一行只写一条语句。
但
if、for、foreach、while等语句后的不单独占用一行,可以使行
数减少,让一个窗口视图可以看到更多的逻辑。
2.不同类型的操作符混合使用时,即使实现优先级与实际需要
相符,最好也使用括号隔离,以便代码更加清晰。
2.2变量规范
1)变量的使用
1.定义并明确变量的含义、作用、取值范围及变量间的关系。
2.变量访问之前一定要初始化。
3.C#中没有全局变量和全局函数。
全局操作是通过静态变量和
静态函数来实现的。
C#编码规范5/24
4.readonly(只读)修饰符,仅在类的数据成员中使用,只能在构
造函数或者直接初始化时赋值一次。
与const数据成员不同的是,
const要求在声明中初始化,而readonly可以先定义,后赋值
(仅一次)。
2)数据类型数据结构
1.使用严格形式定义的、可移植的数据类型,尽量不要使用与
具体硬件或软件环境关系密切的变量。
2.不要设计面面俱到、非常灵活的数据结构。
不同结构间的关
系不要过于复杂。
结构中元素的个数应适中。
3.若结构中元素个数过多,可考虑依据某种原则把元素组成不
同的子结构。
4.认真设计结构中元素的布局与排列顺序,使结构容易理解,
以减少误用现象。
C#编码规范6/24
5.注意具体语言及编译器处理不同数据类型的原则及有关细节。
编程时,要注意数据类型的强制转换。
对编译系统默认的数据类
型转换,也要有充分的认识。
6.尽量减少没有必要的数据类型默认转换与强制转换。
对自定
义数据类型进行恰当命名,使它成为自描述性的,以提高代码可
读性。
注意其命名方式在同一产品中的统一。
7.用户定义的类型可以包括:
类类型(class),结构类型(struct),
接口类型(interface)。
根据类型的内存分配形式的不同又分成值
类型(valuetypes),引用类型(referencetypes)。
8.在对较长字符串操作的时候,避免使用String类,而用效率
比较高的StringBuilder类,可以提高操作的便利性,减少额外
开销和垃圾回收的压力。
2.3命名规范
1)变量、方法函数的命名
1.变量名必须以字母开头
C#编码规范7/24
2.变量名只能由字母、数字和下滑线组成,而不能包含空格、
标点符号、运算符等其他符号。
3.变量名不能与C#中的关键字、库函数名称相同。
4.关于变量命名类型,形式可参考如下。
类型
命名形式
特征
Bool
bFlag
true;false
Char
cName
数字,英文,表达式符
号
Sbyte
sbCount
有符号8
位整数
byte
bCount
无符号8
位整数
short
sCount
有符号16
位整数
ushort
usCount
无符号16
位整数
int
nCount
有符号32
位整数
uint
niCount
无符号32
位整数
long
lCount
有符号64
位整数
C#编码规范8/24
ulongulCount无符号64位整数
floatfCount单精度7位数
decimaldCount双精度15到16位数
stringsName字符串
5.命名要清晰、明了,有明确含义,同时使用完整的单词或大
家基本可以理解的缩写,避免让人产生误解。
而且完整的单词之
间的第一个字母需用大写来区别。
6.关于变量的级别区分。
私有成员变量:
变量前缀”m_”;静态
成员:
变量前缀”s_”。
7.i、j、k作局部循环变量是允许的,x,y经常被作为坐标变量。
8.方法函数的命名要避免使用容易被主观解释的难懂的名称,
使用动词-名词的方法来命名来给定。
9.区分变量和方法函数,方法函数名要使用Pascal大小写处理
(CalculateInvoiceTotal),其中每一个单词的第一字母都是大
写;变量名要使用camel大小写处理(documentFormatType),
C#编码规范9/24
其中除了第一个单词以外每个单词的第一个字母都是大写的方
式来处理。
2)常量、宏定义命名
1.常量和宏定义必须要有一定的实际意义。
2.常量和宏定义在函数定义之前。
3.常量和宏定义必须全部以大写字母来命名,中间可以根据意
义连续性用下划线连接。
而且在右边必须要有注释来说明其意义
和作用。
3)类、委托、接口、名空间的命名
1.以Class声明的类,必须以能够标识事物特性的名词或者名
词短语命名,每个单词的第一个字母必须大写。
2.根据类的特性(命名+特性标识)来命名,参考如下。
特性标识
AttributeAttribute
ExceptionException
C#编码规范10/24
只需要一个对象实例(全局对象)Class
只作为其他类的基类Base
类是窗体Form
类是Web窗体Page
3.委托类型以描述动作的名词命名,以体现委托类型实例的功
能。
4.接口的命名以大写字母“I”加上有意义的单词来命名,每个单
词的第一个字母必须大写。
接口以外的命名,一定要避免使用“I”
作为单个单词首写的命名。
5.名字空间的命名,参照类命名。
4)控件、资源名称命名
1.Web控件的命名以“Web控件大写前缀+‘’+变量名称
“来规范。
控件大小写前缀
FrameFrm
C#编码规范11/24
LabelLbl
TextBoxTxt
CheckBoxChk
ButtonBtn
ListBoxLst
DropDownListDrp
ImageImg
PicturePic
GridGrd
ComBoxCob
2.WindowsForm的控件命名以“Windows控件小写前缀+‘’
+变量名称“来规范。
控件小写前缀
Framfrm
Labellbl
C#编码规范12/24
TextBoxtxt
CheckBoxchk
Buttonbtn
ListBoxlst
DropDownListdrp
Imageimg
Picturepic
Gridgrd
ComBoxcob
3.资源名称命名以“资源大写前缀+‘’+变量名称“来规范。
控件大写前缀
菜单IDM
位图IDB
对话框IDD
字符串IDS
C#编码规范13/24
2.4注释规范
1)模块(类)注释
文件开始注释内容包括:
公司名称、版权、作者姓名、时间、
模块用途、背景介绍等,复杂的算法需要加上流程说明。
/******************************************************************
**文件(类)名:
**Copyright(c)2003-2004*********公司
**创建人:
**日期:
**修改人:
**日期:
**描述:
**
**版本:
**
******************************************************************/
2)函数注释
函数注释包括:
输入、输出、函数描述、流程处理、调用样例
等,复杂的函数需要加上变量用途说明。
/*****************************************************************
**函数名:
C#编码规范14/24
**输入:
a,b,c
**a---
**b---
**c---
**输出:
x---
**x为1,表示...
**x为0,表示...
**功能描述:
**调用模块:
**作者:
**日期:
**修改:
**日期:
**版本:
****************************************************************/
3)代码注释
1.变量、常量的注释。
包括:
简洁准确的注释。
2.程序中的功能块,包括:
修改时间和作者、方便理解的注释等。
3.边写代码边注释,修改代码同时修改相应的注释,以保证注
释与代码的一致性。
4.不再有用的注释要删除。
注释的内容要清楚、明了、含义准
确,防止注释二义性。
C#编码规范15/24
5.避免在注释中使用缩写,特别是非常用缩写注释应与其描述
的代码相近,对代码的注释应放在其上方或右方(对单条语句的
注释)相邻位置,不可放在下面,如放于上方则需与其上面的代
码用空行隔开。
6.对于所有物理含义的变量、常量,如果其命名不是充分注释
的,在声明时都必须加以注释,说明其物理含义、变量、常量、
宏的注释就放在其上方相邻位置或右方。
7.数据结构声明(包括数组、结构、类、枚举等),如果其命
名不是充分注释的,必须加以注释。
8.对数据结构的注释应放在其上方相邻位置,不可放在下面;
对结构中的每个域的注释放在此域的右方。
9.描述内容进行同样的缩排。
将注释与其上面的代码用空行隔开。
10.对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。
C#编码规范16/24
2.5结构化规范
1)程序结构要求
1.程序结构要清晰,简单易懂,单个函数的程序行不得超过200
行。
2.使用.NET库函数和公共函数(无特殊情况,不要使用外部方
法调用windows的核心动态连接库)。
3.代码中垂直对齐左括号和右括号。
4.在函数参数较多的时候,尽量使用结构类型来传递参数。
2)可读性规范
1.要重视程序的可读性,并在其基础上考虑效率。
2.保持代码和注释的一致性。
3.运算符两边要有空格。
4.在复杂的算法前面,必须要有详细解释。
5.循环和分层不要超过5层。
3)结构化规范
C#编码规范17/24
1.禁止GOTO语句。
2.用IF语句来强调只执行两组语句中的一组。
禁止ELSE
GOTO和ELSERETURN的使用。
3.不提倡使用条件赋值语句。
4.不要轻易使用条件分支去替换逻辑表达式。
2.6代码正确性规范
1)代码规范
1.变量在调用前,必须初始化。
2.对所有用户的输入,必须做合法性检查。
3.不要比较浮点数的相等。
4.程序与环境或状态发生关系时,必须主动去处理发生的意外
事件。
5.尽量使用规范的容错语句。
try{
}catch{
}finally{
C#编码规范18/24
}
6.注意装箱和拆箱方法的使用。
7.注意隐性类型转换的值的变化。
2)可复用性规范
1.重复使用完成相对独立功能的算法或者代码,应抽象为
服务或类。
2.尽量用OO思想考虑独立和封装性。
3安全性规范
3.1输入验证类规范
1、避免命令注入类攻击
避免从系统目录获取外部执行程序,通过cmd方式执行;
Stringhome=System.getProperty("APPHOME");
Stringcmd=home+INITCMD;
C#.lang.Runtime.getRuntime().exec(cmd);
命令注入攻击通过改变应用程序执行的命令和改变命令执
行的环境达到攻击目的。
攻击者可以通过修改系统变量
C#编码规范19/24
APPHOME,使其指向一个包含恶意代码的路径,进而利用应用
程序的高级权限来执行任意命令。
因为程序没有对读入的环境变
量值进行验证,如果攻击者能够控制系统的环境变量值
APPHOME,那么攻击者就能欺骗应用程序,让其执行恶意代码,
从而控制系统。
2、避免跨站脚本攻击
应用程序在数据库或者其它可信数据源中存储了危险数据。
这些危险数据随后被应用程序读取并包含在动态内容中。
存储型
XSS通常是由攻击者将危险内容注入数据存储中,然后该内容
被读出并包含在动态内容中。
必须在所有数据进入应用程序之前把可能的危险拦截。
针对
非法的HTML代码包括单双引号等,编写函数对其进行过滤。
3、避免拒绝服务攻击
涉及到系统资源的外部数据应该进行严格校验,防止大数目
或者无限制的输入。
C#编码规范20/24
4、避免路径操控攻击
应用程序应该尽量避免用户直接指定文件系统操作路径,可
以通过文件选择框或者文件列表来让用户指定操作路径,同时对
用户指定的路径进行输入校验,对不符合程序要求的拒绝执行。
对于来自于配置文件等外部资源的路径输入,同样应该进行输入
校验,防止外部输入路径非法或者越界
5、避免日志伪造
应用程序应该避免将用户的输入直接记入日志,可以根据产
生的异常,在程序内部生成日志信息记入日志。
如果需要将来自
于外部的数据记入日志,那么需要对记入日志的数据进行校验,
过滤非法字符。
此外,应该对日志文件进行严格的访问控制,杜
绝XX的用户访问日志。
6、避免SQL注入
应用程序对输入进行验证,要么只接受白名单中的安全字
符,要么鉴别和排除黑名单中的恶意字符。
白名单是一种非常有
C#编码规范21/24
效的方法,虽然它需要执行严格的输入验证规则,但可以减少对
参数化SQL语句的维护,并能够提供更高的安全保证。
3.2API使用规范
1、避免使用GC.Collect()
直接请求进行垃圾回收很有可能导致出现问题,尤其是与时
间和状态有关时。
2、检测函数返回值的空值
程序要对函数的返回值进行非Null校验,否则程序有可能
会去解引用一个空指针。
3、遵循对象模型,定义Equals()和GetHashCode()(
类重写Equals()方法和GetHashCode()方法。
.NET对象需
要满足很多与相等有关的等式,其中一个等式就是相等的对象要
有相等的hash值。
换句话说,如果a.Equals(b)==true,那么
a.GetHashCode()==b.GetHashCode()。
如果该类的对象被存
储在一个collection中,那么不支持上面的这个等式就会导致问
C#编码规范22/24
题。
如果所说的这类对象被用作hash表的Key,或者被插入一
个字典中,那么相等的对象有相等的hash值这一点是至关重要
的。
3.3.net安全特性
1、避免模拟用户的上下文
MicrosoftASP.NET应用程序可以模拟当前用户的安全上
下文或者与它们相关的进程来执行需要特殊权限的操作。
在程序
中不建议修改上下文。
2、避免会话永久有效配置
FormsAuthentication.RedirectFromLoginPage()方法会发
出一个认证结果,允许用户在指定的一段时间内保持已认证状
态。
调用该方法时,如果第二个参数为false,该方法会发出一个
临时的认证结果,该结果在web.config指定的一段时间内有效。
如果第二个参数为true,该方法会发出一个永久性的认证结果。
在.NET2.0中,永久性结果的生命周期由web.config中的值决
C#编码规范23/24
定。
但在.NET1.1中,永久性认证结果有一个可笑的默认生命
周期50年。
允许永久性认证结果存活很长的一段时间会使用户
和系统遭受攻击。
3、错误访问页面
ASP.NET应用程序应该配置使用定制的错误页面来代替
框架默认页面。
默认错误页面会给出发生错误的详细信息,不应
该被用在产品环境中。
标签中的mode属性定义
了是使用定制错误页面还是默认错误页面。
4制度解释
本规范由公司总裁室负责解释和修订。
本规范自2011年9月1日起施行。
C#编码规范24/24