写在后面:本文是依据alibaba的Java开发手册以及WPF源码整顿的一篇实用于C#的开发标准。
命名格调
- 代码中的命名严禁应用拼音与英文混合的形式,更不容许间接应用中文的形式。
- 命名空间、类名、办法、属性、事件、枚举、私有动态字段、常量应用UpperCamelCase格调。
- 公有字段、参数名、局部变量应用lowerCamelCase格调,听从驼峰模式。
- 异样类名应用Exception结尾,测试类名以要测试的类名结尾,Test结尾。
- 防止在子父类的成员变量间、不同代码块的局部变量间采纳雷同的命名。
- 杜绝不标准的缩写,要做到顾名思义。应用缩写时要是被广泛承受的缩写。
- 为达到代码自解释的指标,命名时应尽量应用残缺的单词组合表白意思。
- 在常量与变量命名时,示意类型的名称放在词尾:
startTime
,workQueue
- 接口类中的办法和属性不要加任何润饰符号,加上无效的正文。
- 接口类加I前缀。
- 枚举类名不要加Enum后缀,枚举成员名称应用UpperCamelCase格调命名。
- 用于事件处理的委托加EventHandler后缀,用于事件处理之外的委托加CallBack后缀。
- 在变量名中应用互补对,如min/max、begin/end、open/close
- 不要在事件申明中应用前缀或者后缀,如应应用Close而不是OnClose。
如果变量值仅在一个固定范畴内变动,应用enum类型定义:
public enum Season{ Spring, Summer, Autumn, Winter}
- 用UI组件缩写做UI变量前缀,如:
Label - lbl
TextBox - tbox
TextBlock - tblk
Button - btn
Image - img
Grid - grd
StackPanle - stkpnl
代码格局
- 若大括号内为空,简洁的写成{}即可,大括号两头无需换行和空格;如果非空代码块则左右大括号各占一行。
- 左小括号和字符之间不呈现空格,右小括号和字符间也不要呈现空格。
- if/for/while/switch/do等保留字与括号之间必须加空格。
- 任何二目、三目运算符的左右两边都须要加一个空格。
- 采纳四个空格缩进,禁止应用tab,可在IDE中设置tab为4个空格。
- 正文的双斜线与正文之间有且只有一个空格。
- 在进行类型强制转换时,右括号与强制转换值之间不须要空格。
- 单行字符数限度不超过120个,超出则换行,换行准则如下:
1) 第二行绝对第一行缩进4个空格,从第三行开始,不再缩进;
2) 运算符与下文一起换行;
3) 办法调用的点符号与下文一起换行;
4) 办法调用的多个参数换行时,在逗号后换行;
5) 括号前不要换行 - 办法参数在定义和传入时,多个参数逗号后必须加空格。
- 单个办法的总行数不超过80行。
- 不须要增加若干个空格使变量的赋值等号与上一行对应地位的等号对齐。
- 不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开以晋升可读性。以下状况下应用一个空行:
a. 办法与办法,属性与属性之间;
b. 办法中变量申明与语句之间;
c. 办法中不同逻辑块之间;
d. 办法中的返回语句与其余语句之间;
e. 属性与办法,属性与字段,办法与字段之间; - 任何情景下,不须要插入多个空行进行隔开。
- 一行只做一个申明。
- 倡议在变量申明时就对其做初始化。
- 不要应用public的实例字段。
- 每行一个语句。
面向对象
- 所有笼罩的办法,必须加override。
- 内部正在应用的接口,不容许批改办法签名,防止对接口调用产生影响。
- 构造函数中禁止退出任何业务逻辑,如果有初始化逻辑,请放在init办法中。
- 一个类有多个构造方法,或多个同名办法时这些办法应该按程序放在一起,便于浏览。
- 类内办法定义的程序:私有 > 爱护 > 公有。
- 属性的get、set办法中,不要减少业务逻辑,减少排查问题的难度。
- 慎用对象的Clone办法来拷贝对象,因为是浅拷贝,若想实现深拷贝需笼罩Clone办法。
- 类成员与办法的拜访严格控制:
1) 如果不容许内部间接通过new来创建对象,构造函数必须是private;
2) 工具类不能有public构造方法;
3) 类非static字段必须是private;
4) 类static如果仅在本类应用,必须是private;
5) 类办法如果仅供外部调用,必须是private;
6) 类办法只对继承类公开,限度为protected。 - 不要给成员变量加任何前缀,辨别局部变量与成员变量应用this。
- 类名与文件名保持一致。
- 类型成员的排列程序:
1) 委托、事件申明
2) 公共动态、常量字段
3) 构造函数,参数越少越靠前
4) public办法
5) 属性
6) protected办法 -> private办法 -> internal办法
7) 公有字段
管制语句
- 一个switch中,每个case要么通过continue/break/return等来终止,要么正文阐明程序将执行到哪一个case为止。一个switch中,必须蕴含一个default语句放在最初,即便什么代码也没有。
- 当switch内的变量类型为string且为内部参数时,必须先进行null判断。
- 在if/else/for/while/do语句中必须应用大括号,即便只有一行代码。
- if()...else...嵌套语句不要超过3层,防止代码保护艰难。
- 不要在条件判断语句中执行简单的语句,将简单的逻辑判断后果赋值给一个有意义的布尔值,以进步可读性。
- 不要在其余表达式中插入赋值语句,赋值语句应该独自成行。
- 循环语句要思考性能,定义对象、变量、获取数据库链接、不必要的try-catch等尽量移至循环体外解决。
- 尽量避免采纳取反逻辑运算符,不易了解。
正文
字段、属性、枚举值正文:
/// <summary>/// .../// </summary>public bool IsActive{ ...}
办法、委托正文:
/// <summary>/// .../// </summary>/// <param name="">...</param>/// <returns>...</returns>/// <remarks>(可选)/// .../// </remarks>private bool Function(int param){ ...}
类、接口正文:
/// <summary>/// .../// </summary>public class ClassName{ ...}
- 办法外部的单行正文,在被正文语句上方另起一行,应用//正文。办法外部多行正文应用//正文,不要应用/**/。
- 所有枚举类型的字段必须要有正文,阐明数据项的用处。
- 代码批改的同时,正文也要相应批改。
- 审慎正文掉代码。在上方正文具体阐明,而不是简略的正文掉。如果无用,则删除。
- 好的命名、代码构造是自解释的,正文力求精简精确、表白到位。防止过多过滥的正文,否则代码一旦批改,正文的批改累赘很大。
- 非凡正文标记,需注明标记人与工夫。应及时处理这些标记。如:
1) 待办(TODO):(标记人,标记工夫,[预计解决工夫])示意须要实现但暂未实现的性能;
2) 谬误,不能工作(FIXME):(标记人,标记工夫,[预计解决工夫])错误代码且不能工作,需及时纠正。 - 右花括号"}"后倡议增加正文,以便找到对应的"{"。
- 防止在代码行尾增加正文,仅办法内变量申明或花括号后的正文应用行尾正文。
文件正文:
// <copyright file="*.cs" company="Hisense">// Copyright (c) Hisense. All rights reserved.// </copyright>// <author>xxx</author>// <date>yyyy-mm-dd</date>// <summary>...</summary>// <modify>(可选)// 批改人:// 批改工夫:// 形容:// </modify>
异样解决
- 通过预查看的形式躲避RuntimeException异样,不应该通过catch来解决,如空指针异样,越界异样等。
- 异样不要用来做流程管制,条件管制。
- 对于catch尽可能辨别异样类型,再做对应的异样解决。
- 必须解决异样,否则将其抛给调用者。最外层的业务使用者,必须解决异样,将其转化为用户能够了解的内容。
- finally块必须对资源对象、流对象进行敞开,有异样也要做try-catch。
- 不要在finally中做return,否则会丢掉try中的返回点。
- 办法的返回值能够为null,但必须加正文阐明什么状况下返回null。
- 应尽全力防止NPE(空指针异样)。
- 防止产生反复的代码,否则前期批改时须要批改多个中央,容易脱漏。