CSharp编程规范.docx
《CSharp编程规范.docx》由会员分享,可在线阅读,更多相关《CSharp编程规范.docx(12页珍藏版)》请在冰豆网上搜索。
![CSharp编程规范.docx](https://file1.bdocx.com/fileroot1/2023-2/23/25399d61-6d46-4a27-8e10-2d066abd9aad/25399d61-6d46-4a27-8e10-2d066abd9aad1.gif)
CSharp编程规范
C#编程规范
一、规则
1.程序结构要求
1)程序结构清晰,简单易懂,单个函数的程序行数最好不要超过150行。
2)打算干什么,要简单,直接了当,代码精简,避免垃圾程序。
3)尽量使用.NET库函数和公共函数(无特殊情况不要使用外部方法调用windows的核心动态链接库)。
4)不要随意定义全局变量,尽量使用局部变量。
2.可读性要求
1)可读性第一,效率第二(代码是给人读的)。
2)保持注释与代码完全一致。
3)每个源程序文件,都有文件头说明,说明规格见规范。
4)每个函数,都有函数头说明,说明规格见规范。
5)主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。
6)处理过程的每个阶段都有相关注释说明。
7)在典型算法前都有注释,同时算法在满足要求的情况下尽可能简单。
8)利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位,定义Tab为6个字节。
9)循环、分支层次不要超过五层。
10)注释可以与语句在同一行,也可以在上行。
11)空行和空白字符也是一种特殊注释。
12)一目了然的语句不加注释。
13)注释的作用范围可以为:
定义、引用、条件分支以及一段代码。
14)注释行数(不包括程序头和函数头说明部份)应占总行数的1/5到1/3
15)常量定义(DEFINE)有相应说明。
3.结构化要求
1)禁止出现两条等价的支路。
2)禁止GOTO语句。
3)用IF语句来强调只执行两组语句中的一组。
禁止ELSEGOTO和ELSERETURN。
4)用CASE实现多路分支。
5)避免从循环引出多个出口。
6)函数只有一个出口。
7)不使用条件赋值语句。
8)避免不必要的分支。
9)不要轻易用条件分支去替换逻辑表达式。
4.正确性与容错性要求
1)程序首先是正确,其次是优美
2)无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。
3)改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。
4)所有变量在调用前必须被初始化。
5)对所有的用户输入,必须进行合法性检查。
6)不要比较浮点数的相等,
7)如:
10.0*0.1==1.0,不可靠
8)程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否逻辑锁定、打印机是否联机等,对于明确的错误,要有明确的容错代码提示用户。
9)单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。
10)尽量使用规范的容错语句.
例如:
try{
}
catch{
}
finally{
}
二、命名和约定
1.花括号的使用
1)要把左花括号放在前一条语句的末尾。
2)要使用右花括号与左花括号所在的行的行首对其,除非花括号内只有一条语句。
if(someExpression){
DoSomething();
}
get{aValue=value;}
3)要把右花括号放在新的一行的开始处。
4)将只有一个访问方法的属性的所有花括号放在同一行内。
PublicintFoo{get{returnfoo;}}
5)要使右花括号单独占一行,除非他后面是else,elseif或者while
if(someExpression){
do{
doSomething();
}while(someOtherCondition);
}
6)避免省略花括号,即便语法允许,这样可以增加代码的可维护性。
2.空格的使用
1)要在左括号之后和右括号之前加一个空格
publicintFoo{get{returnfoo;}}
2)避免在左括号之前加空格
3)要在形式参数之间的逗号后加一个空格
正确:
publicvoidFoo(charbar,intx,inty)
错误:
publicvoidFoo(charbar,intx,inty)
4)避免在实际参数之间加空格。
正确:
Foo(myChar,0,1)
错误:
Foo(myChar,0,1)
5)避免在左圆括号之后或右圆括号之前加空格。
正确:
Foo(myChar,0,1)
错误:
Foo(myChar,0,1);
6)不要在成员的名字和左括号之前加空格
正确:
Foo()
错误:
Foo()
3.注释
1)用注释描述代码的用意、大致的算法以及逻辑流程。
使代码编写者之外的人能够通过独自阅读注释来理解函数的行为和目的。
2)不要用注释来描述一些人人都显而易见的事。
3)避免使用/*---------*/的注释用法
4)使用//的单行注释方法
5)不要把注释放在尾行,除非注释非常简短
Privateintcount;//定义某某数量
///
///版本
///Copyright(c)2010-2011大连恒宜科技有限公司
///创建人:
赵金明
///日期:
2010/8/9
///描述:
///
publicclassaClass:
object{
}
///
///方法的功能描述
///
///参数说明
///参数说明
///返回值说明
publicboolaFunction(inta,stringb){
}
///
///属性描述
///
publicstringaProperty{
get{}
set{}
}
4.大小写
1)一个标识符中的多个单词,把标识符中的每个单词的首字母大小写。
不允许用下划线或者其他标识符进行分离。
正确:
TextColor
错误:
Textcolor
错误:
Text_Color
2)如果是复合单词只有第一个单词是大写。
标识符
样例
命名空间
namespaceSystem.Security{…}
类
publicclassStreamReader{…}
接口
publicinterfaceIEnumerable{…}
方法
publicclasseObject{
publicvirtualstringToString();
}
属性
publicclassString{
publicintLength{get;}
}
事件
publicclassProcess{
publiceventEventHandlerExited;
}
字段
publicMessageQueue{
publicstaticreadonlyTimeSpanInfiniteTimeout;
}
枚举
FileMode{
Append,
…
}
参数
PublicclassConvert{
publicstaticintToInt32(stringvalue)
}
5.单词缩写
1)尽量避免在标识符中使用首字母缩写词。
除非他是普遍使用的,如HTML、XML和IO。
2)由三个或以上的字母组成的首字母缩写词遵循与任何其他单词一样的规范。
3)两个字母组成的首字母缩写词的处理可以大写。
publicvoidStartIO(StreamioStream,boolcloseIOStream);
publicvoidProcessHtmlTag(stringhtmlTag)
4)要把两个字母的首字母缩写词全部大写。
5)要把由是三个或三个以上字母组成的首字母缩写词的第一个字母大写。
System.Xml
publicvoidProcessHtmlTag(stringhtmlTag){
}
6)不要使用缩写词作为标识符名字的一部分。
正确:
GetWindow
错误:
GetWin
7)不要使用广泛应用的首字母缩写词
UI:
UserInterface
HTML:
HypertextMarkupLanguage
6.常用复合词
BitFlagCallbackCanceledDoNotEmailEndpoint
FileNameGridlineHashtableIdIndexes
LogOffLogOnMetadataMultipanelMultiview
NamespaceOkPiPlaceholderSignInSignOut
UserNameWhiteSpaceWritable
7.通用命名约定
1)名字的意思清楚要比长短度更重要。
2)要为标识符选择易于阅读的名字
HorizontalAlignment比AlignmentHorizontal好。
3)要看中可读性,而不是简短性。
4)不要用下划线、连接符以及其他任何即非字母也非数字的字符。
5)避免使用与广泛使用的编程语言的关键字有冲突的标识符。
6)避免使用语言中特有的名字,要给类型名使用语义上有意义的名字,而不要使用语言特有的关键字。
正确:
GetLength
错误:
GetInt
8.Dll的命名规则
..dll
9.命名空间的规则
.(|)[.][.]
1)用公司名称作为命名空间的前缀。
2)用稳定的与版本无关的产品名称作为命名空间的第二层。
3)不要根据公司的组织框架决定空间的层次结构。
4)考虑在适当的时候在命名空间中使用复数形式。
如System.Collections
5)不要让命名空间的名字与类的名字重复。
6)避免非常深的名字空间层次。
这样的层次难于浏览。
7)避免有太多的命名空间。
10.类的命名
1)通常,类型名应该是名词组合,因为他们代表系统中的实体。
如果无法为另行找到一个名词词组,那么可能应该重新考虑该类型的总体设计。
2)少数情况下允许使用形容词词组来命名。
3)不要给类名加字母前缀。
4)考虑让类的名字已基类的名字结尾。
如,RangeException是Exception的一种。
SerializbleAttribute是Attribute的一种。
5)要让接口的名字以字母I开头,这样可以显示出该类型是一个借口。
6)要确保一对类/接口的名字只相差一个“I”前缀,如果该类是该接口的标准实现。
如publicclassComponent:
IComponent{……}
11.枚举类型的命名
1)要用单数名词命名枚举类型,除非他表示的是位域(bitfield)
2)不要给枚举类型的名字添加Enum后缀。
3)不要给枚举类型的名字加“Flag”或“Flags”后缀。
4)不要给枚举类型的名字加任何前缀。
12.方法的命名
1)要用动词或动词组来命名方法
publicclassString{
publicintCompareTo(…);
publicstring[]Split(…);
publicstringTrim();
}
13.属性的命名
1)要用名词、名词组或形容词来命名属性。
2)不要让属性名看起来与“Get”方法的名字相似
如:
publicstringTextWriter{get{}set{}}
publicstringGetTextWriter(……)
3)要用肯定的词语命名bool型属性。
可以有选择的给bool型的属性加“Is”“Can”“Has”等前缀。
但Created比IsCreated要好。
Enable比IsEnable要好。
4)考虑用属性的类型名来命名属性
如:
publicColorColor{get{}set{}}
14.事件的命名
1)要用动词或动词短语来命名事件。
2)要用现在时和过去时来赋予时间名以之前之后的概念。
3)不要用Before或者After前缀或后缀来命名事件。
4)要在名字事件处理函数时加上“EventHandler”后缀。
5)要在事件处理函数中用Sender和e作为两个参数的名字。
6)要在命名时间的参数类时加上“EventArgs”后缀。
pubicclassClickedEventArgs:
EventArgs{
intx;
inty;
publicClickedEnventArgs(intx,inty){
this.x=x;
this.y=y;
}
publicintX{get{returnx;}}
publicintY{get{returny;}}
}
15.字段的命名
1)要用名词或名词短语来命名字段。
2)不要给字段名添加前缀。
如“m_”,“s_”。
16.参数的命名
1)要使用具有毛属性的参数名,参数名应该具备足够的描述性,使得在多数情况下,用户根据参数的名字和类型就能够确定它的意思。
2)考虑根据参数的意思而不是参数的类型来命名参数。
三、程序
3)程序编码力求简洁,结构清晰,避免太多的分支结构及太过于技巧性的程序,
4)尽量不采用递归模式。
5)编写程序时,亦必须想好测试的方法,换句话说,”单元测试”的测试方案应在程序编写时一并拟好。
6)注释一定要与程序一致。
7)版本封存以后的修改一定要将老语句用/**/封闭,不能自行删除或修改,并要
8)在文件及函数的修改记录中加以记录。
9)程序中每个block的开头”{"及"}”必须对齐,嵌套的block每进一套,
10)缩进一个tab,TAB为4个空格,block类型包括if、for、while、do等关键字引出的。
11)对于比较大的函数,每个block和特殊的函数调用,都必须注明功能.