软件部编程规范C#版.docx
- 文档编号:9307955
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:30
- 大小:31.91KB
软件部编程规范C#版.docx
《软件部编程规范C#版.docx》由会员分享,可在线阅读,更多相关《软件部编程规范C#版.docx(30页珍藏版)》请在冰点文库上搜索。
软件部编程规范C#版
北京云星宇研发中心软件部
软件开发编码规范
编号:
版本:
V0.2
编写:
2010年2月
审核:
年月日
批准:
年月日
文件档案表
编号
名称
湖南省高速公路MTC收费系统需求规格说明书(车道子系统)
页数
版本
V0.1
与文档相关的文件位置(URL)
设计
编写
QA审核/校验
评审
批准
责任人
日期
所属机构
安全保密级别
普通
秘密
★
机密
高级机密
备注
修改记录
日期
版本号
内容摘要
作者
2010/01/21
0.1
初稿
赵阳
2010/01/27
0.2
增加修改注释规范,修改控件命名规范
刘刚
2010/01/26
0.3
根据评审会议,删减部分指南,对代码修改规范进行较严格要求
赵阳
C#编程规范
1前言
1.1编写目的
为了保证企业编写出的程序都符合相同的规范,保证一致性、统一性而建立的程序编码规范。
1.2范围
适用于企业所有基于.NET平台的软件开发工作。
1.3命名规范
【1.3.1】不要追求世界上最好的命名规则!
在机构内部一致即可。
【1.3.2】直观并且可以拼读,可望文知意,不必“解码”。
【1.3.3】名字的长度:
min-length&&max-information原则
【1.3.4】与操作系统和开发工具的风格保持一致
【1.3.5】程序中不要出现仅靠大小写区分的相似的标识符
【1.3.6】程序中不要出现标识符完全相同的局部变量和全局变量
【1.3.7】变量的名字应当使用“名词”或者“形容词+名词”
【1.3.8】全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。
类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。
【1.3.9】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等
【1.3.10】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号
1.4程序开发规范
1.4.1表达式和基本语句
【1.4.1.1】如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。
【1.4.1.2】不要编写太复杂的复合表达式。
不要把程序中的复合表达式与“真正的数学表达式”混淆。
【1.4.1.3】如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。
【1.4.1.3】建议for语句的循环控制变量的取值采用“半开半闭区间”写法。
1.4.2函数设计
【1.4.2.1】参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。
【1.4.2.2】参数命名要恰当,顺序要合理。
【1.4.2.3】建议避免函数有太多的参数,参数个数尽量控制在5个以内。
【1.4.2.4】尽量不要使用类型和数目不确定的参数。
【1.4.2.5】函数名字与返回值类型在语义上不可冲突。
【1.4.2.6】不要将正常值和错误标志混在一起返回。
【1.4.2.7】在函数体的“入口处”,对参数的有效性进行检查。
【1.4.2.8】在函数体的“出口处”,对return语句的正确性和效率进行检查。
【1.4.2.9】函数的功能要单一,不要设计多用途的函数。
【1.4.2.10】函数体的规模要小,尽量控制在50行代码之内。
【1.4.2.11】尽量避免函数带有“记忆”功能。
相同的输入应当产生相同的输出。
带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态”。
【1.4.2.12】不仅要检查输入参数的有效性,还要检查通过其他途径进入函数体内的变量的有效性,例如全局变量、文件句柄等。
【1.4.2.13】用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情况。
1.4.3资源管理
【1.4.3.1】动态获得资源(包括内存、文件句柄、数据库连接、网络连接等)之后,应该立即检查资源值是否为合法有效。
【1.4.3.2】不要忘记为数组和动态内存赋初值。
防止将未被初始化的内存作为右值使用。
【1.4.3.3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。
【1.4.3.4】动态资源的申请与释放必须配对,防止资源泄漏。
【1.4.3.5】释放了资源之后,立即将资源引用指针设置为“空值”,防止产生“野指针”。
2.规范内容详解
2.1代码格式
◆所有的缩进为4个空格,使用VS.NET的默认设置。
◆在代码中垂直对齐左括号和右括号。
if(x==0)
{
Response.Write("用户编号必须输入!
");
}
不允许以下情况:
if(x==0){
Response.Write("用户编号必须输入!
");
}
或者:
if(x==0){Response.Write("用户编号必须输入!
");}
◆为了防止在阅读代码时不得不滚动源代码编辑器,每行代码或注释在1024*800的显示频率下不得超过一显示屏
◆当一行被分为几行时,通过将串联运算符放在每一行的末尾而不是开头,清楚地表示没有后面的行是不完整的。
◆每一行上放置的语句避免超过一条。
◆在大多数运算符之前和之后使用空格,这样做时不会改变代码的意图却可以使代码容易阅读。
例:
intj=i+k;
而不应写为
intj=i+k;
◆将大的复杂代码节分为较小的、易于理解的模块。
合理使用#region#endergion将同类的方法集中在一起。
2.2命名指南
2.2.1大写样式
使用下面的三种大写标识符约定。
Pascal大小写
将标识符的首字母和后面连接的每个单词的首字母都大写。
可以对三字符或更多字符的标识符使用Pascal大小写。
例如:
BackColor
Camel大小写
标识符的首字母小写,而每个后面连接的单词的首字母都大写。
例如:
backColor
大写
标识符中的所有字母都大写。
仅对于由两个或者更少字母组成的标识符使用该约定。
例如:
System.IO
System.Web.UI
可能还必须大写标识符以维持与现有非托管符号方案的兼容性,在该方案中所有大写字母经常用于枚举和常数值。
一般情况下,在使用它们的程序集之外这些字符应当是不可见的。
下表汇总了大写规则,并提供了不同类型的标识符的示例。
标识符
大小写
示例
类
Pascal
AppDomain
枚举类型
Pascal
ErrorLevel
枚举值
Pascal
FatalError
事件
Pascal
ValueChange
异常类
Pascal
WebException
注意总是以Exception后缀结尾。
只读的静态字段
Pascal
RedValue
接口
Pascal
IDisposable
注意总是以I前缀开始。
方法
Pascal
ToString
命名空间
Pascal
System.Drawing
参数
Camel
typeName
属性
Pascal
BackColor
受保护的实例字段
Camel
redValue
注意很少使用。
属性优于使用受保护的实例字段。
公共实例字段
Pascal
RedValue
注意很少使用。
属性优于使用公共实例字段。
2.2.2区分大小写
为了避免混淆和保证跨语言交互操作,请遵循有关区分大小写的使用的下列规则:
◆不要使用要求区分大小写的名称。
对于区分大小写和不区分大小写的语言,组件都必须完全可以使用。
不区分大小写的语言无法区分同一上下文中仅大小写不同的两个名称。
因此,在创建的组件或类中必须避免这种情况。
◆不要创建仅是名称大小写有区别的两个命名空间。
例如,不区分大小写的语言无法区分以下两个命名空间声明。
namespaceee.cummings;
namespaceEe.Cummings;
◆不要创建具有仅是大小写有区别的参数名称的函数。
下面的示例是不正确的。
voidMyFunction(stringa,stringA)
◆不要创建具有仅是大小写有区别的类型名称的命名空间。
在下面的示例中,Pointp和POINTp是不适当的类型名称,原因是它们仅是大小写有区别。
System.Windows.Forms.Pointp
System.Windows.Forms.POINTp
◆不要创建具有仅是大小写有区别的属性名称的类型。
在下面的示例中,intColor和intCOLOR是不适当的属性名称,原因是它们仅是大小写有区别。
intColor{get,set}
intCOLOR{get,set}
◆不要创建具有仅是大小写有区别的方法名称的类型。
在下面的示例中,calculate和Calculate是不适当的方法名称,原因是它们仅是大小写有区别。
voidcalculate()
voidCalculate()
2.2.3缩写
为了避免混淆和保证跨语言交互操作,请遵循有关区缩写的使用的下列规则:
◆不要将缩写或缩略形式用作标识符名称的组成部分。
例如,使用GetWindow,而不要使用GetWin。
◆不要使用计算机领域中未被普遍接受的缩写。
◆在适当的时候,使用众所周知的缩写替换冗长的词组名称。
例如,用UI作为UserInterface的缩写,用OLAP作为On-lineAnalyticalProcessing的缩写。
◆在使用缩写时,对于超过两个字符长度的缩写请使用Pascal大小写或Camel大小写。
例如,使用HtmlButton或HTMLButton。
但是,应当大写仅有两个字符的缩写,如,System.IO,而不是System.Io。
◆不要在标识符或参数名称中使用缩写。
如果必须使用缩写,对于由多于两个字符所组成的缩写请使用Camel大小写,虽然这和单词的标准缩写相冲突。
2.2.4措词
避免使用与常用的.NET框架命名空间重复的类名称。
例如,不要将以下任何名称用作类名称:
System、Collections、Forms或UI。
有关.NET框架命名空间的列表,请参阅类库。
另外,避免使用和以下关键字冲突的标识符。
AddHandler
AddressOf
Alias
And
Ansi
As
Assembly
Auto
Base
Boolean
ByRef
Byte
ByVal
Call
Case
Catch
CBool
CByte
CChar
CDate
CDec
CDbl
Char
CInt
Class
CLng
CObj
Const
CShort
CSng
CStr
CType
Date
Decimal
Declare
Default
Delegate
Dim
Do
Double
Each
Else
ElseIf
End
Enum
Erase
Error
Event
Exit
ExternalSource
False
Finalize
Finally
Float
For
Friend
Function
Get
GetType
Goto
Handles
If
Implements
Imports
In
Inherits
Integer
Interface
Is
Let
Lib
Like
Long
Loop
Me
Mod
Module
MustInherit
MustOverride
MyBase
MyClass
Namespace
New
Next
Not
Nothing
NotInheritable
NotOverridable
Object
On
Option
Optional
Or
Overloads
Overridable
Overrides
ParamArray
Preserve
Private
Property
Protected
Public
RaiseEvent
ReadOnly
ReDim
Region
REM
RemoveHandler
Resume
Return
Select
Set
Shadows
Shared
Short
Single
Static
Step
Stop
String
Structure
Sub
SyncLock
Then
Throw
To
True
Try
TypeOf
Unicode
Until
volatile
When
While
With
WithEvents
WriteOnly
Xor
eval
extends
instanceof
package
var
2.2.5避免类型名称混淆
不同的编程语言使用不同的术语标识基本托管类型。
类库设计人员必须避免使用语言特定的术语。
请遵循本节中描述的规则以避免类型名称混淆。
使用描述类型的含义的名称,而不是描述类型的名称。
如果参数除了其类型之外没有任何语义含义,那么在这种罕见的情况下请使用一般性名称。
例如,支持将各种数据类型写入到流中的类可以有以下方法。
[VisualBasic]
SubWrite(valueAsDouble);
SubWrite(valueAsSingle);
SubWrite(valueAsLong);
SubWrite(valueAsInteger);
SubWrite(valueAsShort);
[C#]
voidWrite(doublevalue);
voidWrite(floatvalue);
voidWrite(longvalue);
voidWrite(intvalue);
voidWrite(shortvalue);
不要创建语言特定的方法名称,如下面的示例所示。
[VisualBasic]
SubWrite(doubleValueAsDouble);
SubWrite(singleValueAsSingle);
SubWrite(longValueAsLong);
SubWrite(integerValueAsInteger);
SubWrite(shortValueAsShort);
[C#]
voidWrite(doubledoubleValue);
voidWrite(floatfloatValue);
voidWrite(longlongValue);
voidWrite(intintValue);
voidWrite(shortshortValue);
如果有必要为每个基本数据类型创建唯一命名的方法,那么在这种极为罕见的情况下请使用通用类型名称。
下表列出基本数据类型名称和它们的通用替换。
C#类型名称
VisualBasic类型名称
JScript类型名称
VisualC++类型名称
Ilasm.exe表示形式
通用类型名称
sbyte
SByte
sByte
char
int8
SByte
byte
Byte
byte
unsignedchar
unsignedint8
Byte
short
Short
short
short
int16
Int16
ushort
UInt16
ushort
unsignedshort
unsignedint16
UInt16
int
Integer
int
int
int32
Int32
uint
UInt32
uint
unsignedint
unsignedint32
UInt32
long
Long
long
__int64
int64
Int64
ulong
UInt64
ulong
unsigned__int64
unsignedint64
UInt64
float
Single
float
float
float32
Single
double
Double
double
double
float64
Double
bool
Boolean
boolean
bool
bool
Boolean
char
Char
char
wchar_t
char
Char
string
String
string
String
string
String
object
Object
object
Object
object
Object
例如,支持将从流读取各种数据类型的类可以有以下方法。
[VisualBasic]
[C#]
doubleReadDouble();
floatReadSingle();
longReadInt64();
intReadInt32();
shortReadInt16();
前面的示例优于下面的语言特定的替换。
[VisualBasic]
[C#]
doubleReadDouble();
floatReadFloat();
longReadLong();
intReadInt();
shortReadShort();
2.2.6命名空间命名指南
命名命名空间时的一般性规则是使用公司名称,后跟技术名称和可选的功能与设计,如下所示。
例如:
Microsoft.Media
Microsoft.Media.Design
给命名空间名称加上公司名称或者其他知名商标的前缀可以避免两个已经发布的命名空间名称相同的可能性。
例如,Microsoft.Office是由Microsoft提供的OfficeAutomationClasses的一个适当的前缀。
在第二级分层名称上使用稳定的、公认的技术名称。
将组织层次架构用作命名空间层次架构的基础。
命名一个命名空间,该命名空间包含为具有.Design后缀的基命名空间提供设计时功能的类型。
例如,System.Windows.Forms.Design命名空间包含用于设计基于System.Windows.Forms的应用程序的设计器和相关的类。
嵌套的命名空间应当在包含它的命名空间中的类型上有依赖项。
例如,System.Web.UI.Design中的类依赖于System.Web.UI中的类。
但是,System.Web.UI中的类不依赖于System.UI.Design中的类。
应当对命名空间使用Pascal大小写,并用句点分隔逻辑组件,如Microsoft.Office.PowerPoint中所示。
如果您的商标使用非传统的大小写,请遵循您的商标所定义的大小写,即使它与规定的Pascal大小写相背离。
例如,命名空间NeXT.WebObjects和ee.cummings阐释了对于Pascal大小写规则的适当背离。
如果在语义上适当,使用复数命名空间名称。
例如,使用System.Collections而不是System.Collection。
此规则的例外是商标名称和缩写。
例如,使用System.IO而不是System.IOs。
不要为命名空间和类使用相同的名称。
例如,不要既提供Debug命名空间也提供Debug类。
最后,请注意命名空间名称不必非得与程序集名称相似。
例如,如果命名程序集MyCompany.MyTechnology.dll,它没有必要非得包含MyCompany.MyTechnology命名空间。
建议软件部按此命名规范对正在开发的软件进行如下规范:
2.2.7类命名指南
以下规则概述命名类的指南:
◆使用名词或名词短语命名类。
◆使用Pascal大小写。
◆少用缩写。
◆不要使用类型前缀,如在类名称上对类使用C前缀。
例如,使用类名称,而不是C。
◆不要使用下划线字符(_)。
◆有时候需要提供以字母I开始的类名称,虽然该类不是接口。
只要I是作为类名称组成部分的整个单词的第一个字母,这便是适当的。
例如,类名称IdentityStore是适当的。
◆在适当的地方,使用复合单词命名派生的类。
派生类名称的第二个部分应当是基类的名称。
例如,ApplicationException对于从名为Exception的类派生的类是适当的名称,原因是ApplicationException是一种Exception。
请在应用该规则时进行合理的判断。
例如,Button对于从Control派生的类是适当的名称。
尽管按钮是一种控件,但是将Control作为类名称的一部分将使名称不必要地加长。
下面是正确命名的类的示例。
[VisualBasic]
PublicClass
PublicClassButton
PublicClassString
[C#]
publicclass
publicclassButton
publicclassString
2.2.8接口命名指南
以下规则概述接口的命名指南:
◆用名词或名词短语,或者描述行为的形容词命名接口。
例如,接口名称IComponent使用描述性名词。
接口名称ICustomAttributeProvider使用名词短语。
名称IPersistable使用形容词。
◆使用Pascal大小写。
◆少用缩写。
◆给接口名称加上字母I前缀,以指示该类型为接口。
◆在定义类/接口对(其中类是接口的标准实现)时使用相似的名称。
两个名称的区别应该只是接口名称上有字母I前缀。
◆不要使用下划线字符(_)。
以下是正确命名的接口的示例。
[VisualBasic]
PublicInterfaceIServiceProvider
PublicInterfaceIFormatable
[C#]
publicinterfaceIServiceProvider
publicinterfaceIFormatable
以下代码示例阐释如何定义IComponent接口及其标准实现Component类。
[VisualBasic]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 编程 规范 C#