这篇文章呢,主要写代码的书写规范,好习惯很重要 转载自:阴立坤的个人网站(我们软件研发社的社长) 1. 引言 本文是一套面向C# programmer 和C# developer 进行开发所应遵循的开发规范。 按照此规范来开发C#程序可带来以下益处: · 代码的编写保持一致性, · 提高代码的可读性和可维护性, · 在团队开发一个项目的情况下,程序员之间可代码共享 · 易于代码的回顾, 本规范是初版,只适用于一般情况的通用规范,并不能覆盖所有的情况。 2. 文件组织 2.1 C# 源文件 类名或文件名要简短,不要超过2000LOC,将代码分割开,使结构清晰。将每个类放在一个单独的文件中,使用类名来命名文件名(当然扩展名是.cs)。这种约定会使大家工作更简单。 2.2 目录设计 为每一个命名空间创建一个目录。(用MyProject/TestSuite/TestTier作为MyProject.TestSuite.TestTier的路径,而不用带点的命名空间名做路径)这样可以更容易地将命名空间映射到目录层次划分。 3. 缩进 3.1 换行 当一个表达式超过一行时,根据这些通用原则进行处理: · 在逗号后换行。 · 在操作符后换行。 · 在高层换行而不要在低层处换行。 · 折行后对齐上一行语句同一层的表达式起始位置。 方法调用换行示例: longMethodCall(expr1, expr2, expr3, expr4, expr5); 算术表达式换行示例: 推荐: var = a * b / (c - g + f) + 4 * z; 不好的格式——应避免: var = a * b / (c - g + f) + 4 * z; 推荐使用第一种方法,因为是在括号表达式之外折行(高层次折行原则)。注意要用制表符到缩进的位置,然后用用空格到折行的位置。在我们的例子中是: > var = a * b / (c - g + f) + > …4 * z; ”>“表示是制表符,”.”表示是空格符。(制表符后是空白是用制表符缩进)。一个好的编码习惯就是在所用的编辑器中显示制表符和空格符。 3.2 空白 利用空格进行缩进从未有过统一的标准。一些人喜欢用两个空格,一些人喜欢用四个空格而还有一些人喜欢用八个空格,甚至有的人喜欢用更多的空格。好的做法是用制表符。制表符有一些优点: · 每个人都可以设置他们自己喜欢的缩进层级。 · 它仅仅是1个字符而不是2,4,8等等,因此它将减少输入(甚至因为自动缩进,有时你不得不手工设置缩进或取消设置,等等诸如此类的操作)。 · 如果你想增加或减少缩进,可以标记一块,使用Tab增加缩进层级而用Shift-Tab减少缩进层级。这几乎对于任何文本编辑器都是适用的。 这里,我们定义制表符为标准缩进符。 不要用空格缩进—用制表符! 4. 注释 4.1 块注释 块注释通常应该是被避免的。推荐使用///注释作为C#的标准声明。如果希望用块注释时你应该用以下风格: /* Line 1 * Line 2 * Line 3 / 因为样可以为读者将注释块与代码块区分开。虽然并不提倡使用C风格的单行注释,但你仍然可以使用。一旦用这种方式,那么在注释行后应有断行,因为很难看清在同一行中前面有注释的代码: / blah blah blah */ 块注释在极少情况下是有用的。通常块注释用于注释掉大的代码段。 4.2 单行注释 你应该用//注释风格“注释掉”代码(快捷键,Alt+/)。它也可以被用于代码的注释部分。 单行注释被用于代码说明时必须缩进到相应的编进层级。注释掉的代码应该放在第一行被注释掉以使注释掉的代码更容易看清。 一条经验,注释的长度不应该超过被解释代码的长度太长,因为这表示代码过于复杂,有潜在的bug。 4.3 文件注释 在.net 框架,Microsoft 已经介绍了一个基于XML 注释的文件。这些文件是包括XML 标签的正规的单行的C#注释。他们遵循单行注释的模式: /// , | Case | Notes |
|---|---|---|
| Class / Struct | Pascal Casing | |
| Interface | Pascal Casing | Starts with I |
| Enum values | Pascal Casing | |
| Enum type | Pascal Casing | |
| Events | Pascal Casing | |
| Exception class | Pascal Casing | End with Exception |
| public Fields | Pascal Casing | |
| Methods | Pascal Casing | |
| Namespace | Pascal Casing | |
| Property | Pascal Casing | |
| Protected/private Fields | Camel Casing | |
| Parameters | Camel Casing | |
| 9. 编程习惯 9.1 可见性 不要任何公共实例或类变量,让它们为私有的。对于私有成员最好不用“private”作修饰语什么都不写。私有是默认情况,每个C#程序员都应该知道这一点。 用属性代替。你可以用公共静态(或常量)对于这个规则是以例外,带它不应该是规则。 9.2 没有“幻”数 不要用幻数,也就是在源代码中直接用常数值。替代这些后者以防变化(比方说,你的应用程序可以处理3540用户代替427你的代码在50行中通过分散25000LOC)是错误和没有收益的。声明一个带有数的常量来代替: public class MyMath { public const double PI = 3.14159… } 10. 编码举例 10.1 Brace placement example namespace ShowMeTheBracket { public enum Test { TestMe, TestYou } public class TestMeClass { Test test; public Test Test { get { return test; } set { test = value; } } void DoSomething() { if (test == Test.TestMe) { //…stuff gets done } else { //…other stuff gets done } } } } 括弧应该在以下情况之后以新行开始: · 命名空间声明(注意这在0.3版本中是新添的与0.2版本不同) · 类/接口/结构声明 · 方法声明 10.2 变量命名举例 代替: for (int i = 1; i < num; ++i) { meetsCriteria[i] = true; } for (int i = 2; i < num / 2; ++i) { int j = i + i; while (j <= num) { meetsCriteria[j] = false; j += i; } } for (int i = 0; i < num; ++i) { if (meetsCriteria[i]) { Console.WriteLine(i + ” meets criteria”); } } try intelligent naming : for (int primeCandidate = 1; primeCandidate < num; ++primeCandidate) { isPrime[primeCandidate] = true; } for (int factor = 2; factor < num / 2; ++factor) { int factorableNumber = factor + factor; while (factorableNumber <= num) { isPrime[factorableNumber] = false; factorableNumber += factor; } } for (int primeCandidate = 0; primeCandidate < num; ++primeCandidate) { if (isPrime[primeCandidate]) { Console.WriteLine(primeCandidate + ” is prime.”); } } 注意:索引变量通常叫i, j, k 等等。但Note: Indexer variables generally should be called i, j, k etc. But 万一像这样,使得重新考虑这个原则更有意义。一般来说,当同一个计数器或索引器被重用,给它们有意义的名字。 |
C#代码规范-程序员必备