1、 2、C#代码规范 .NET程序员需要提升的修养 2010-08-10 09:51 javincoder 博客园 我要评论(0) 没有规矩不成方圆,.NET程序员在日常的工作中坚持良好的编码习惯,对于今后的代码维护以及交接工作都大有裨益。1. 引言本文是一套面向C# programmer 和C# developer 进行开发所应遵循的开发规范。按照此规范来开发C#程序可带来以下益处:代码的编写保持一致性, 提高代码的可读性和可维护性, 在团队开发一个项目的情况下,程序员之间可代码共享 易于代码的回顾,本规范是初版,只适用于一般情况的通用规范,并不能覆盖所有的情况。2. 文件组织2.1 C# 源
2、文件类名或文件名要简短,不要超过2000LOC,将代码分割开,使结构清晰。将每个类放在一个单独的文件中,使用类名来命名文件名(当然扩展名是.cs)。这种约定会使大家工作更简单。2.2 目录设计为每一个命名空间创建一个目录。(用MyProject/TestSuite/TestTier作为MyProject.TestSuite.TestTier的路径,而不用带点的命名空间名做路径)这样可以更容易地将命名空间映射到目录层次划分。3. 缩进3.1 换行当一个表达式超过一行时,根据这些通用原则进行处理: 在逗号后换行。 在操作符后换行。 在高层换行而不要在低层处换行。 折行后对齐上一行语句同一层的表达式
3、起始位置。方法调用换行示例:1. longMethodCall(expr1,expr2, 2. 3. expr3,expr4,expr5);算术表达式换行示例:推荐:4. var=a*b/(c-g+f)+ 5. 6. 4z;不好的格式应避免:7. var8. 9. 推荐使用第一种方法,因为是在括号表达式之外折行(高层次折行原则)。注意要用制表符到缩进的位置,然后用用空格到折行的位置。在我们的例子中是:10. var11. 12. .4表示是制表符,.表示是空格符。(制表符后是空白是用制表符缩进)。一个好的编码习惯就是在所用的编辑器中显示制表符和空格符。3.2 空白利用空格进行缩进从未有过统一的
4、标准。一些人喜欢用两个空格,一些人喜欢用四个空格而还有一些人喜欢用八个空格,甚至有的人喜欢用更多的空格。好的做法是用制表符。制表符有一些优点: 每个人都可以设置他们自己喜欢的缩进层级。 它仅仅是1个字符而不是2,4,8等等,因此它将减少输入(甚至因为自动缩进,有时你不得不手工设置缩进或取消设置,等等诸如此类的操作)。 如果你想增加或减少缩进,可以标记一块,使用Tab增加缩进层级而用Shift-Tab减少缩进层级。这几乎对于任何文本编辑器都是适用的。这里,我们定义制表符为标准缩进符。不要用空格缩进用制表符!4. 注释4.1 块注释块注释通常应该是被避免的。推荐使用/注释作为C#的标准声明。如果希
5、望用块注释时你应该用以下风格:13. /*Line1 14. 15. *2 16. 17. *3 18. 19. */因为样可以为读者将注释块与代码块区分开。虽然并不提倡使用C风格的单行注释,但你仍然可以使用。一旦用这种方式,那么在注释行后应有断行,因为很难看清在同一行中前面有注释的代码:20. /*blah*/块注释在极少情况下是有用的。通常块注释用于注释掉大的代码段。4.2 单行注释你应该用/注释风格“注释掉”代码(快捷键,Alt+/)。它也可以被用于代码的注释部分。单行注释被用于代码说明时必须缩进到相应的编进层级。注释掉的代码应该放在第一行被注释掉以使注释掉的代码更容易看清。一条经验,注
6、释的长度不应该超过被解释代码的长度太长,因为这表示代码过于复杂,有潜在的bug。4.3 文件注释在.net 框架,Microsoft 已经介绍了一个基于XML 注释的文件。这些文件是包括XML 标签的正规的单行的C#注释。他们遵循单行注释的模式:21. / 22. 23. /Thisclass. 24. 25. /summary多行XML 注释遵循这种模式:26. /exceptioncref=”BogusException”27. 28. /getsthrownassoona 29. 30. /Bogusflagset. 31. 32. /exception为了被认作是XML注释行,所有的行
7、都必须用三个反斜线开始。标签有以下两类: 文件说明项 格式/参考第一类包括像, or 的标签。描述一个程序的API元素的这些文档说明项必须写清楚以方便其他程序员。如上面的多行注释示例所示,这些标签通常带有名称或cref属性。编译器会检查这些属性,所以它们必须是有效、正确的。第二类用诸如listpara标签,用于控制备注说明的布局。文件可以用文件菜单中的创建菜单产生。文件以HTML格式产生。5. 声明5.1 每行的声明数推荐每行只有一个声明,因为它可以方便注释。33. intlevel;/indentationlevel 34. 35. intsize;sizeoftable当声明变量时,不要把
8、多个变量或不同类型的变量放在同一行,例如:36. inta,b;/Whatisa?Whatdoesbstandfor?上面的例子也显示了变量名不明显的缺陷。当命名变量时要清晰。5.2 初始化局部变量一旦被声明就要初始化。例如:37. stringnamemyObject.Name;或38. intvaltime.Hours;注意:如果你初始化一个dialog,设计使用using语句:39. using(OpenFileDialogopenFileDialognewOpenFileDialog() 40. 41. . 42. 43. 5.3 类和接口声明当编写C#类和接口时,应遵循以下格式化规则
9、: 在方法名和圆括号“(”开始它的参数列表之间不要使用空格。 在声明语句的下一行以大括号标志开始。 以结束,通过它自身的缩进与相应的开始标志匹配。44. ClassMySample:MyClass,IMyInterface 45. 46. 47. 48. intmyInt;49. 50. publicMySample(intmyInt) 51. 52. 53. 54. this.myIntmyInt;55. 56. 57. 58. voidInc() 59. 60. 61. 62. +myInt;63. 64. 65. 66. EmptyMethod() 67. 68. 69. 70. 71.
10、 72. 对于一个大括号的位置参考10.1部分。6. 语句6.1 简单语句每行都应该只包含一条语句。6.2 返回语句一个返回语句不要用最外围圆括号。不用:return (n * (n + 1) / 2);用: return n * (n + 1) / 2;6.3 If, if-else, if else-if else 语句if, if-else and if else-if else 语句看起来应该像这样:73. if(condition)74. 75. DoSomething();76. 77. . 78. 79. 80. 81. if82. 83. DoSomething();84. 8
11、5. . 86. 87. else88. 89. DoSomethingOther();90. 91. . 92. 93. 94. 95. if96. 97. DoSomething();98. 99. . 100. 101. if102. 103. DoSomethingOther();104. 105. . 106. 107. 108. 109. DoSomethingOtherAgain();110. 111. . 112. 113. 6.4 for / foreach 语句一个for语句应该如下形式:114. for(inti0;5;+i)115. 116. . 117. 118. 或
12、者放置一行(考虑用一个while语句代替)119. for(initialization;condition;update)foreach语句应该像下面所示 :120. foreachinIntList)121. 122. . 123. 124. 在一个循环中,即使只有一个语句通常也用括弧括起来。6.5 While/do-while 语句一个while语句应该写成如下形式:125. while126. 127. . 128. 129. 一个空while语句应该是以下格式:while (condition) ;一个do-while语句应该是如下格式:130. do131. 132. 133. 1
13、34. . 135. 136. while(condition);6.6 Switch 语句一个switch语句应该如下格式:137. switch138. 139. caseA:140. 141. . 142. 143. break;144. 145. caseB:146. 147. . 148. 149. break;150. 151. default:152. 153. . 154. 155. break;156. 157. 6.7 Try-catch 语句一个try-catch statement语句应该遵循以下格式:158. try159. 160. . 161. 162. catc
14、h(Exception) 163. 164. or 165. 166. try167. 168. . 169. 170. (Exceptione)171. 172. . 173. 174. 175. 176. or 177. 178. try179. 180. . 181. 182. 183. 184. . 185. 186. finally187. 188. . 189. 190. 7. 空白7.1 空行空行提高可读性。它们分开那些逻辑上自身相关联的代码块。两行空格行应该用于以下之间: 一个源文件的逻辑段。 类和接口定义(每个文件只定义一个类或接口以避免这种情况)。一个空格行应该总是被用于以
15、下之间: 方法 属性 一个方法中的局部变量和它的第一条语句 一个方法中的逻辑段为了提高可读性。注意空白行必须被缩进因为它们包括一条语句这使得插入这些行更容易。7.2 内部空格在一个逗号或一个分号之后应该由一个空格,例如:191. TestMethod(a,b,c);不要用:TestMethod(a,b,c)192. TestMethod(c);单个空格包围操作符(除了像加的一元操作符和逻辑非),例:193. adontusea=b;194. 195. for10;fori=0;i+i) 196. 197. /or 198. 199. /for(int7.3 表格格式化行的一个逻辑块应该作为一个
16、表格被格式化:200. stringMr.Ed201. 202. intmyValue203. 204. TestaTestTest.TestYou;对于表格的格式化用空格而不用制表符因为在某些制表符缩进设置会使表格格式化看起来是很奇怪。8. 命名习惯8.1 大写格式8.1.1 Pascal Casing习惯大写每个单词的第一个字母(就像在TestCounter)。8.1.2 Camel Casing习惯除了第一个单词外大写每个单词的第一个字母例如testCounter。8.1.3 全大写情况对于只有一两个字符缩写组成的标识符才用全大写的情况。有三个或更多个字符组成的标识符应该用Pascal情
17、况代替。205. publicclassMath 206. 207. 208. 209. publicconstPI. 210. 211. publicE212. 213. publicfeigenBaumNumber214. 215. 8.2. 命名指导方针通常根据指导方针在名字和命名内用低线字符对Hungarian 符号来说被认为是坏习惯。Hungarian 符号是一组应用于命名来映射变量类型的前缀和后缀。这种命名风格在早期的Windows程序中被广泛应用,但现在被取消了至少不提倡了。如果你遵循这个指南用Hungarian 符号是不允许的。但要记住一个好的变量名描述了语义而不失类型。对于这
18、个规则有个例外就是GUI编码。包括像按钮(buttton)的GUI元素,所有领域和变量名都应该带有它们类型名的后缀不是缩写。216. System.Windows.Forms.ButtoncancelButton;217. 218. System.Windows.Forms.TextBoxnameTextBox;8.2.1 类命名指导方针 类命名必须是名词或名词短语。 UsePascal 情况参考8.1.1 不要用任何类前缀8.2.2 接口命名指导方针Guidelines 用可以描述行为的名词或名词短语或形容词命名接口。(例如IComponent 或 IEnumberable) 用Pascal
19、情况(参考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) 考虑用与其类型相
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2