C#编码规范
文档版本V0.01
1. 目的
规范C#代码的书写,提高代码的可读性,使开发人员在代码上更好的协作,减少新开发成员熟悉现有代码的时间,间接提高软件代码的可维护性。
2. 命名规范
1) 命名约定
标识符构成:
所有标识符应由一个或多个完整的英文单词构成,除通用的缩略词如IO、Http、id等或是项目特定的专用缩略词如项目名称的缩写等,不应使用未被普遍接受的单词缩略形式。可以适当使用下划线“_”。
2) 大小写约定
Pascal : 组成标识符的所有单词的首字母大写,如Get、BackColor。
Camel : 组成标识符的第一个单词全小写,后续单词首字母大小,如get、backColor。
全大写:组成标识符的所有单词的所有字母全部大写。
缩略词 :
➢ 不要使用半个单词的缩写形式,如GetWin,而应使用GetWindow。
➢ 不要使用不被普遍认可的首字母缩写。在适当情况下,使用通用的首字母缩写,如
UI表示 User interface,而OLAP表示 On-line Analytical Processing。两个字母的缩写单独使用时可以适当使用全大写书写风格替代Pascal风格。
➢ 不要在标识符或参数名中使用首字母缩写,必须使用时,应使用Camel形式。 ➢ Id不是首字母缩写,不应使用全大写方式。
3) C#命名规范
以.Net 公共语言规范(CLSCompliant)为基础,规定标识符的命名规则。 标识符类别 命名空间 大小写约定 Pascal 示例 System; System.Web; Page; UserControl; DateTime; DateTimeKind; EventHandler; IDisposable; IHttpHandler; Error; FatalError; BackColor; GetBackColor; BackColorChanged; backColor; name; userId 委托、枚举、结构、Pascal(对于特殊类型,应使类名 用特定后缀,参见附录I) 接口 枚举成员 属性、方法、事件 Pascal, 并带有前缀I Pascal Pascal 方法、属性参数声明 Camel 泛型参数声明 私有字段 Pascal,T或带有前缀T Camel,推荐使用下划线前缀,以区别于局部变量。对于控件变量,应使用对应的控件类型缩写。对于静态私有字段,使用g_ 前缀。与属性对应的私有字段使用属性名前加下划线。 T; TResult; TKey; TValue; _backColor; _userId; txtUsername; txtPassword; s_instance;_UserName; 保护字段 私有常量 公共常量 公共字段 局部变量
禁止使用。 Pascal(包括私有静态只读字段)。 Pascal(包括公共静态只读字段)。 禁止使用。 Camel。 int.Max 4) 代码书写风格
使用Visual Studio默认书写风格,在签入代码之前,应使用 Ctrl + K, Ctrl + D快捷键格
式化代码,保证源码管理服务器对代码差异的正确评估。
5) 编码要求
1. 单个类、方法的代码行数不应过长,否则应考虑进行拆分。
2. 局部变量引用Disposable类实例的,必须使用 using 语法进行Dispose 操作。或在
特殊情况下,使用 try{..} finally {…} 进行手动Dispose操作。
3. 类的实例字段包含Disposable 类型的,类必须也要实现 IDisposable接口。 4. 属性的 get 访问器不应有任何副作用。 5. 如果枚举的值可以组合使用, 应对其标注 FlagsAttribute 特性。这种情况下枚举类
型名称建议使用复数。
6. 枚举应该包含 0 值,以对应未初始化状态的值。
7. 类型之间的耦合应尽量简单。如果A使用B, B使用C,则A应尽量不直接使用
C。
如A中某方法的代码:this.BInstance.GetC().DoSomething(); 应该尽量改为: this. BInstance.MakCDoSomthing();
8. 谨慎区分返回值与异常。对于错误使用异常机制报告而不是返回值。 9. 尽量catch 具体的异常类型,而不是 Exception类型。 10. 处理异常时需重新抛出该异常时,使用throw; 而不是 throw ex; 后者会重置堆栈跟
踪信息。
11. 在 finally 块中释放资源。
6) 关于自动生成的代码
7) 注释
➢ 所有C#代码文件必须包含文件头注释,格式如下:
//======================================================// Product Name // Module Name
//====================================================== // 版权声明
//====================================================== // 内容描述
//====================================================== // 创建人 // 创建日期 // 最后修改人 // 最后修改日期
//====================================================== // 备注
//======================================================
➢ ➢ ➢ ➢ ➢ ➢
所有类、结构、枚举、委托、方法、属性、字段都必须书写文档注释。 复杂的代码段应有必要的解释性注释。 文档注释中所有参数必需说明用途、用法。
文档注释中,所有方法、属性访问器,如可能产生异常,应注明异常类型及前提。 如果注释无法清楚的表明代码的用途,添加简单的 example 注释。 属性注释请使用以下语法结构: 获取或设置 ….. 。 获取 …. 。
8) 关于自动生成的代码
自动生成的代码不应进行任何手动修改。
3. 设计规范
1) 分层设计
采用分层设计,表现层、业务逻辑层、数据访问层是必须的。
2) 面向接口编程
面向接口编程,而不是面向类编程。
3) 测试友好
所编写的代码必须容易测试。
4) 耦合简单
与某一个类有直接关系的其它类的数量应尽量少。 类与类之间尽量用接口进行耦合。
附录I 特殊类名后缀 基类型/接口 System.Attribute后缀 Attribute System.EventArgsSystem.ExceptionEventArgs Exception System.Collections.ICollectionCollection System.Collections.IDictionaryDictionary System.Collections.IEnumerableSystem.Collections.QueueSystem.Collections.StackCollection Collection 或 Queue Collection 或 Stack System.Collections.Generic.ICollection(T)Collection Dictionary System.Collections.Generic.IDictionary(TKey, TValue)System.Data.DataSetDataSet System.Data.DataTableSystem.IO.StreamCollection 或 DataTable Stream System.Security.IPermissionPermission System.Security.Policy.IMembershipCondition事件处理程序委托。 Condition EventHandler 业务实体类 业务逻辑类/接口 数据访问类/接口 Info后缀。 Manager后缀。 DataProvider后缀。对于事件处理程序委托,使用两个参数无返回值的形式,其中第一个参数为System.Object类型,表示事件源,第二个参数为System.EventArgs类型的派生类,表示事件参数, 如果可能, 使用System.EventHandler泛型。附录I 首选词条 过时的词条 Arent Cancelled Cant ComPlus Couldnt Didnt Doesnt Dont 首选词条 AreNot Canceled Cannot EnterpriseServices CouldNot DidNot DoesNot DoNot Flag 或 Flags Hadnt Hasn’t Havent Indices Isnt LogIn LogOut Shouldnt SignOn SignOff Wasnt Werent Wont Wouldnt Writeable 无替代词条。不要使用。 HadNot HasNot HaveNot Indexes IsNot LogOn LogOff ShouldNot SignIn SignOut WasNot WereNot WillNot WouldNot Writable
参考文档:
http://msdn.microsoft.com/zh-cn/library/y8hcsad3.aspx