c#代码Word下载.docx
《c#代码Word下载.docx》由会员分享,可在线阅读,更多相关《c#代码Word下载.docx(29页珍藏版)》请在冰点文库上搜索。
∙2、C#代码规范.NET程序员需要提升的修养
∙
2010-08-1009:
51
javincoder
博客园
我要评论(0)
没有规矩不成方圆,.NET程序员在日常的工作中坚持良好的编码习惯,对于今后的代码维护以及交接工作都大有裨益。
1.引言
本文是一套面向C#programmer和C#developer进行开发所应遵循的开发规范。
按照此规范来开发C#程序可带来以下益处:
·
代码的编写保持一致性,
提高代码的可读性和可维护性,
在团队开发一个项目的情况下,程序员之间可代码共享
易于代码的回顾,
本规范是初版,只适用于一般情况的通用规范,并不能覆盖所有的情况。
2.文件组织
2.1C#源文件
类名或文件名要简短,不要超过2000LOC,将代码分割开,使结构清晰。
将每个类放在一个单独的文件中,使用类名来命名文件名(当然扩展名是.cs)。
这种约定会使大家工作更简单。
2.2目录设计
为每一个命名空间创建一个目录。
(用MyProject/TestSuite/TestTier作为MyProject.TestSuite.TestTier的路径,而不用带点的命名空间名做路径)这样可以更容易地将命名空间映射到目录层次划分。
3.缩进
3.1换行
当一个表达式超过一行时,根据这些通用原则进行处理:
在逗号后换行。
在操作符后换行。
在高层换行而不要在低层处换行。
折行后对齐上一行语句同一层的表达式起始位置。
方法调用换行示例:
1.longMethodCall(expr1,
expr2,
2.
3.
expr3,
expr4,
expr5);
算术表达式换行示例:
推荐:
4.var
=
a
*
b
/
(c
-
g
+
f)
+
5.
6.
4
z;
不好的格式——应避免:
7.var
8.
9.
推荐使用第一种方法,因为是在括号表达式之外折行(高层次折行原则)。
注意要用制表符到缩进的位置,然后用用空格到折行的位置。
在我们的例子中是:
10.>
var
11.
12.>
......4
'
>
表示是制表符,'
.'
表示是空格符。
(制表符后是空白是用制表符缩进)。
一个好的编码习惯就是在所用的编辑器中显示制表符和空格符。
3.2空白
利用空格进行缩进从未有过统一的标准。
一些人喜欢用两个空格,一些人喜欢用四个空格而还有一些人喜欢用八个空格,甚至有的人喜欢用更多的空格。
好的做法是用制表符。
制表符有一些优点:
每个人都可以设置他们自己喜欢的缩进层级。
它仅仅是1个字符而不是2,4,8等等,因此它将减少输入(甚至因为自动缩进,有时你不得不手工设置缩进或取消设置,等等诸如此类的操作)。
如果你想增加或减少缩进,可以标记一块,使用Tab增加缩进层级而用Shift-Tab减少缩进层级。
这几乎对于任何文本编辑器都是适用的。
这里,我们定义制表符为标准缩进符。
不要用空格缩进—用制表符!
4.注释
4.1块注释
块注释通常应该是被避免的。
推荐使用///注释作为C#的标准声明。
如果希望用块注释时你应该用以下风格:
13./*
Line
1
14.
15.*
2
16.
17.*
3
18.
19.*/
因为样可以为读者将注释块与代码块区分开。
虽然并不提倡使用C风格的单行注释,但你仍然可以使用。
一旦用这种方式,那么在注释行后应有断行,因为很难看清在同一行中前面有注释的代码:
20./*
blah
*/
块注释在极少情况下是有用的。
通常块注释用于注释掉大的代码段。
4.2单行注释
你应该用//注释风格“注释掉”代码(快捷键,Alt+/)。
它也可以被用于代码的注释部分。
单行注释被用于代码说明时必须缩进到相应的编进层级。
注释掉的代码应该放在第一行被注释掉以使注释掉的代码更容易看清。
一条经验,注释的长度不应该超过被解释代码的长度太长,因为这表示代码过于复杂,有潜在的bug。
4.3文件注释
在.net框架,Microsoft已经介绍了一个基于XML注释的文件。
这些文件是包括XML标签的正规的单行的C#注释。
他们遵循单行注释的模式:
21.///
<
summary>
22.
23.///
This
class...
24.
25.///
/summary>
多行XML注释遵循这种模式:
26.///
exception
cref=”BogusException”>
27.
28.///
gets
thrown
as
soon
a
29.
30.///
Bogus
flag
set.
31.
32.///
/exception>
为了被认作是XML注释行,所有的行都必须用三个反斜线开始。
标签有以下两类:
文件说明项
格式/参考
第一类包括像<
<
param>
or<
exception>
的标签。
描述一个程序的API元素的这些文档说明项必须写清楚以方便其他程序员。
如上面的多行注释示例所示,这些标签通常带有名称或cref属性。
编译器会检查这些属性,所以它们必须是有效、正确的。
第二类用诸如<
code>
list>
para>
标签,用于控制备注说明的布局。
文件可以用‘文件’菜单中的‘创建’菜单产生。
文件以HTML格式产生。
5.声明
5.1每行的声明数
推荐每行只有一个声明,因为它可以方便注释。
33.int
level;
//
indentation
level
34.
35.int
size;
size
of
table
当声明变量时,不要把多个变量或不同类型的变量放在同一行,例如:
36.int
a,
b;
//What
is
a'
?
What
does
b'
stand
for?
上面的例子也显示了变量名不明显的缺陷。
当命名变量时要清晰。
5.2初始化
局部变量一旦被声明就要初始化。
例如:
37.string
name
myObject.Name;
或
38.int
val
time.Hours;
注意:
如果你初始化一个dialog,设计使用using语句:
39.using
(OpenFileDialog
openFileDialog
new
OpenFileDialog())
{
40.
41....
42.
43.}
5.3类和接口声明
当编写C#类和接口时,应遵循以下格式化规则:
在方法名和圆括号“(”开始它的参数列表之间不要使用空格。
在声明语句的下一行以大括号"
{"
标志开始。
以"
}"
结束,通过它自身的缩进与相应的开始标志匹配。
44.Class
MySample
:
MyClass,
IMyInterface
45.
46.{
47.
48.
int
myInt;
49.
50.
public
MySample(int
myInt)
51.
52.
53.
54.
this.myInt
myInt
;
55.
56.
}
57.
58.
void
Inc()
59.
60.
61.
62.
++myInt;
63.
64.
65.
66.
EmptyMethod()
67.
68.
69.
70.
71.
72.}
对于一个大括号的位置参考10.1部分。
6.语句
6.1简单语句
每行都应该只包含一条语句。
6.2返回语句
一个返回语句不要用最外围圆括号。
不用:
return(n*(n+1)/2);
用:
returnn*(n+1)/2;
6.3If,if-else,ifelse-ifelse语句
if,if-elseandifelse-ifelse语句看起来应该像这样:
73.if
(condition)
74.
75.DoSomething();
76.
77....
78.
79.}
80.
81.if
82.
83.DoSomething();
84.
85....
86.
87.}
else
88.
89.DoSomethingOther();
90.
91....
92.
93.}
94.
95.if
96.
97.DoSomething();
98.
99....
100.
101.}
if
102.
103.DoSomethingOther();
104.
105....
106.
107.}
108.
109.DoSomethingOtherAgain();
110.
111....
112.
113.}
6.4for/foreach语句
一个for语句应该如下形式:
114.for
(int
i
0;
5;
++i)
115.
116....
117.
118.}
或者放置一行(考虑用一个while语句代替)
119.for
(initialization;
condition;
update)
foreach语句应该像下面所示:
120.foreach
in
IntList)
121.
122....
123.
124.}
在一个循环中,即使只有一个语句通常也用括弧括起来。
6.5While/do-while语句
一个while语句应该写成如下形式:
125.while
126.
127....
128.
129.}
一个空while语句应该是以下格式:
while(condition);
一个do-while语句应该是如下格式:
130.do
131.
132.{
133.
134....
135.
136.}
while
(condition);
6.6Switch语句
一个switch语句应该如下格式:
137.switch
138.
139.case
A:
140.
141....
142.
143.break;
144.
145.case
B:
146.
147....
148.
149.break;
150.
151.default:
152.
153....
154.
155.break;
156.
157.}
6.7Try-catch语句
一个try-catchstatement语句应该遵循以下格式:
158.try
159.
160....
161.
162.}
catch
(Exception)
{}
163.
164.or
165.
166.try
167.
168....
169.
170.}
(Exception
e)
171.
172....
173.
174.}
175.
176.or
177.
178.try
179.
180....
181.
182.}
183.
184....
185.
186.}
finally
187.
188....
189.
190.}
7.空白
7.1空行
空行提高可读性。
它们分开那些逻辑上自身相关联的代码块。
两行空格行应该用于以下之间:
一个源文件的逻辑段。
类和接口定义(每个文件只定义一个类或接口以避免这种情况)。
一个空格行应该总是被用于以下之间:
方法
属性
一个方法中的局部变量和它的第一条语句
一个方法中的逻辑段为了提高可读性。
注意空白行必须被缩进因为它们包括一条语句这使得插入这些行更容易。
7.2内部空格
在一个逗号或一个分号之后应该由一个空格,例如:
191.TestMethod(a,
b,
c);
不要用:
TestMethod(a,b,c)
192.TestMethod(
c
);
单个空格包围操作符(除了像加的一元操作符和逻辑非),例:
193.a
don'
t
use
a=b;
194.
195.for
10;
for
i=0;
i<
++i)
196.
197.//
or
198.
199.//
for(int
7.3表格格式化
行的一个逻辑块应该作为一个表格被格式化:
200.string
"
Mr.
Ed"
201.
202.int
myValue
203.
204.Test
aTest
Test.TestYou;
对于表格的格式化用空格而不用制表符因为在某些制表符缩进设置会使表格格式化看起来是很奇怪。
8.命名习惯
8.1大写格式
8.1.1PascalCasing
习惯大写每个单词的第一个字母(就像在TestCounter)。
8.1.2CamelCasing
习惯除了第一个单词外大写每个单词的第一个字母例如testCounter。
8.1.3全大写情况
对于只有一两个字符缩写组成的标识符才用全大写的情况。
有三个或更多个字符组成的标识符应该用Pascal情况代替。
205.public
class
Math
206.
207.{
208.
209.public
const
PI
...
210.
211.public
E
212.
213.public
feigenBaumNumber
214.
215.}
8.2.命名指导方针
通常根据指导方针在名字和命名内用低线字符对Hungarian符号来说被认为是坏习惯。
Hungarian符号是一组应用于命名来映射变量类型的前缀和后缀。
这种命名风格在早期的Windows程序中被广泛应用,但现在被取消了至少不提倡了。
如果你遵循这个指南用Hungarian符号是不允许的。
但要记住一个好的变量名描述了语义而不失类型。
对于这个规则有个例外就是GUI编码。
包括像按钮(buttton)的GUI元素,所有领域和变量名都应该带有它们类型名的后缀不是缩写。
216.System.Windows.Forms.Button
cancelButton;
217.
218.System.Windows.Forms.TextBox
nameTextBox;
8.2.1类命名指导方针
类命名必须是名词或名词短语。
UsePascal情况参考8.1.1
不要用任何类前缀
8.2.2接口命名指导方针Guidelines
用可以描述行为的名词或名词短语或形容词命名接口。
(例如IComponent或IEnumberable)
用Pascal情况(参考8.1.1)
用I作为名字的前缀,它应该紧跟一个大写字母(接口名的第一个字母)
8.2.3枚举命名指导方针
用Pascal情况命名枚举值名字和类型名字
枚举类型和枚举值不要前缀
对于枚举用单一名字
对于位领域用复数名字
8.2.4只读和常量命名
用名词,名词短语或名词的缩写命名静态领域
使用Pascal情况(参考8.1.1)
8.2.5参数/非常量领域命名
一定要用描述性名字,应该能够足够表现变量的意义和它的类型。
但一个好的名字应该基于参数的意义。
使用Camel情况(参考8.1.2)
8.2.6变量命名
计数变量当用在琐碎的计数循环式更适宜叫i,j,k,l,m,n。
(参考10.2例如对全局计数的更智能命名等等)—
8.2.7方法命名
用动词或动词短语命名方法。
使用Pascal(参考8.1.2)
8.2.8属性命名
用名词或名词短语命名属性
使用Pascal情况(参考8.1.2)
考虑用与其类型相