.NET C#编码规范

第一部分  简介

本文档只适用于C#语言以及其实现的.NET Framework公共类型系统(CTS)
一、使用编码规范的目标:定义一些原则以保证编码格式的一致性,提高代码的可读性和可维护性,并保护开发人员尽量减少由编码引起的错误。
二、术语和定义
1.访问修饰符:
public protected internal private C#中大多数成员使用private,而借口和枚举默认的访问修饰符为public
2.骆驼命名法
第一个单词的首字母小写,后续各单词的首字母均大写。
例:depName
3.公共类型系统
.NET Framework公共类型系统(CTS)定义如何声明、使用和管理类型。所有本地的C#类型都基于CTS,支持跨语言集成。
4.标识符
自定义的标记,用于唯一命名对象或对象实例
例:public class MyclassOfPersonal{}
5.帕斯卡命名法
第一个单词首字母大写,后续个单词的首字母也大写。
三、命名总则
1.命名惯例:c 表示骆驼命名法p 表示帕斯卡命名法 – 表示下划线为前缀
标识符             public      protected    internal           private          说明
项目文件          p                                                             与程序集和命名空间匹配
源文件             p                                                             与包含的类匹配
其他文件          p                                                             在可能的位置使用
命名空间          p                                                             与项目/程序集部分匹配
类或结构          p             p                p                     p       为子类添加后缀
接口                p             p                p                     p       用大写字母I作前缀
方法                p             p                p                     p       使用动词或动词与对象组合
属性                p             p                p                     p       不要用Get或Set做前缀
字段                p             p                p                     _c      只使用private字段,不使用胸牙利命名法
常量                p             p                p                     _c 
静态字段          p              p                p                     _c     只使用private字段
枚举                p              p                p                     p       枚举符中的可选项也必须符合帕斯卡命名法
委托                p              p                p                     p 
事件                p              p                p                     p 
参数                                                 c 
2.编码风格
代码           风格
源文件 每个文件有一个命名空间和一个类
大括号 位于新行,可选时始终使用括号
缩进           使用大小为4的制表符
注释           使用//或///,不使用“…”,也不使用星号框注释方法
变量           每个声明有一个变量
3.语言用法
本地数据类型            使用内置C#本地数据类型与.NET CTS类型,例如使用int而不是Int32
枚举              避免更改默认类型
属性              不要用Get或Set做前缀
方法              最多是用7个参数
base和this            仅用于构造函数或重写中
foreach语句            不要修改foreach语句中的枚举项
条件              避免针对true或false计算布贰条件;不使用嵌入式赋值;避免调用嵌入式方法
异常              不得将异常用于流控制;重新引发是使用throw;而不是throw e;只捕获可以处理的内容; 使用验证以避免发生异常;从Execption而不是ApplicationException中派生
事件              调用前始终检查是否为null
Dispose()和Close()           如果提供了这些方法,则始终对其进行调用,并在需要的位置进行声明
程序集版本            手动递增


第二部分  命名惯例

 

命名惯例:一致性—是可维护代码的关键。对于命名项目、源文件和标识符(如字段、变量、属性、方法、参数、类、接口、和命名空间),要确保命名的一致性。

一、一些通用的规则
1.始终使用骆驼命名法或帕斯卡命名法。
2.避免使用全部大写和全部小写的名称,单个小写单词或字母是允许的。
3.不要创建只按照大写而改变的命名空间、类、方法、属性、字段或参数。
4.不要使用以数字字符开头的名称。
5.选择有意义且特定的名称。
6.尽量使用详尽而不过于简洁的命名。
7.变量和属性应该描述实体而不是类型或大小。
8.不推荐使用匈牙利命名法。
9.避免使用缩略语,除非全程过长。
10.避免使用超过5个字符的缩略语。
11.所有的缩略语都必须为大家所熟知和接受。
12.对两个字母的缩略语使用小写,而对较长的缩略语使用帕斯卡命名法。
13.不使用C#保留字作为名称。
14.避免命名与现有.NET Framework命名空间或类型冲突。
15.避免向标识符添加冗长或没有意义的前缀和后缀。
16.不要在属性名称中包含父类名称。
17.尽量将Can  Is  Has 用做布尔变量和属性的前缀。
18.在适当的地方将计算限定符附加给变量名称,如Average、Count、Sum、Min、Max
19.定义根命名空间时,请将产品名、公司名或开发人员姓名作为根。

二、名称用法与语法
项目文件:帕斯卡命名法。始终将程序集名称与根命名空间匹配。
源文件:帕斯卡命名法,始终将类名与文件名匹配。避免每个文件包括多个类、枚举(全局)或委托(全局)。包含多个类、枚举或委托时,使用描述性文件名。
资源或嵌入式文件:尽量使用帕斯卡命名法。使用描述文件内容的名称。
命名空间:帕斯卡命名法。尽量与醒目/程序集名称部分匹配。
类或结构:帕斯卡命名法。用名词或名词短语作为类名称。如果可能,在为其他类型划分子类是添加相应的类后缀。
接口:帕斯卡命名法。用大写字母I作为接口名称的前缀。
方法:帕斯卡命名法。尽量使用动词或动词与对象组合。
属性:帕斯卡命名法。属性名称应该表示其返回的实体。绝对不要将Get或Set用作属性名称的前缀。
字段(Public、Protected或Internal):帕斯卡命名法。避免使用非private字段!请使用属性。
字段(Private):使用骆驼命名法,并用单个下划线字符“_”作为前缀。
常量或静态字段:作为字段处理,选择以上响应的字段访问修饰符。
枚举:使用帕斯卡命名法(类型和选项)。
委托或事件:作为字段处理,选择以上相应的字段访问修饰符。
参数:骆驼命名法。

 


第三部分  编码风格

 

编码风格:以下描述实现C#源代码推荐的方法,以便创建易于理解、易于维护、可读性强、结构清晰并且前后一致的代码。

一、格式设置:
1、每个文件不要生命多个命名空间。
2、避免在单个文件中放置多个类。
3、将大括号{和}放置于新行。
4、在条件语句中使用大括号{和}。
5、使用大小为4的制表符和缩进。
6、独立声明每个变量,即不在同一个语句中声明多个变量。
7、将命名空间和using语句置于文件顶部。将命名空间分组为.NET 命名空间和自定义命名空间。
8、按照以下顺序按类型对内部类进行分组。
  成员变量。
  构造函数与终结器。
  嵌套枚举、结构和类。
  属性。
  方法。
9、根据访问修饰符和可见性为类型中的序列声明分组。
      public
      protected
      internal
      pricate
10、将文件夹名称附加到子文件夹内源文件的命名空间。
11、递归缩进括号内包含的所有代码块。
12、使用空白(回车符/换行符、制表符等)分割和组织代码。
13、将程序集范围的属性声明放置于一个单独的行。
14、将类型范围的属性声明放置在一个单独的行。
15、将方法范围的属性声明放置在一个单独的行。
16、将成员范围的属性声明放置在一个单独的行。
17、将参数属性是声明于参数内联。
18、如果存有疑问,结构清晰、前后一致为原则。

二、代码注释
1、使用//或///,不使用/*….*/。
2、不使用星号框注释方法。
3、不要使用行内注释解释明显易懂的代码,质量高的编码具有自解释性能。
4、始终为public、protected和internal声明应用C#注释块(//)

 


第四部分 语言用法


一、一般用法
1、不要省略访问修饰符。用相应访问修饰符显式声明所有标识符,而不允许显式声明默认值的标识符。
2、不要使用默认的(“1.0.*”)版本控制模式。手动增加AssemblyVersionAttribute值。
3、将所有程序集的ComVisibleAttibute设置为false。然后,选择性地对需要的单个类启用ComVisibleAttribute。
4、避免程序集之间的相互引用。

二、变量和类型
1、尽量在声明变量的语句中将变量初始化。
2、使用要求的最简单的数据类型、列表或对象。例如,一般使用int类型,除非知道需要存储64位的值,才使用long类型。
3、始终使用内置C#数据类型别名,而不是.NET公共类型系统(CTS),包括:
  使用short不用System.Int16
  使用int不用System.Int32
  使用long不用System.Int64
  使用string不用System.String
4、只是将成员变量声明为private,使用属性为带有public、protected或internal访问修饰符的变量提供访问。
5、避免为enum指定类型。除非显式需要long类型,否则使用默认的int类型。
6、避免声明内联字符串常数,而是使用常量、资源、注册表或其他数据资源。
7、只为简单类型生命常量。
8、为复杂类型声明只读或静态只读变量,而不声明常量。
9、避免直接类型转换。而是使用as 运算符并检查是否为null。
10、始终使用for循环显式初始化引用类型的数组。
11、避免装箱和拆箱值类型。
12、浮点值在小数点前后至少应该各包括一个数字。
13、在字符串常数前加上前缀@,而不使用转义字符串。
14、不要在循环内连接字符串。
15、不要将字符串与String.Empty或“”相比较来检查空字符串,而是使用String.Length==0进行比较。
16、避免在循环内进行隐藏的字符串分配,而是使用String.Compare()。

三、流控制
1、避免在条件表达式内调用方法。
2、避免使用foreach循环不可变值类型集合,如字符串数组。
3、不要修改foreach语句中的枚举项。
4、避免针对true或false计算布尔条件。
5、避免在条件语句内进行赋值。
6、避免使用复合条件表达式,请使用布尔变量将各部分分为多个易处理的表达式。
7、避免在条件中进行显式布尔测试。
8、只对具有并行条件逻辑的简单操作使用switch/case语句。
9、对于短条件序列和复杂条件,优先使用嵌套if/else语句,而不是switch/case。
10、优先使用多态而不是switch/case来封装和委托复杂操作。

四、异常处理
1、不使用try/catch块用于流控制。
2、只捕获可处理的异常。
3、不的声明空catch块。
4、避免在catch块内嵌套try/catch。
5、避免再次引发异常,而是允许其冒泡。
6、如果再次引发异常,则省略throw语句中的异常参数,以保留原始调用堆栈。
7、只使用finally块从try语句中释放资源。
8、使用验证来避免异常。
9、引发新异常时,使用传递innerException,以维护异常树和内部调用堆栈。

五、事件、委托和线程
1、调用前始终检查事件和委托实例是否为空。
2、对简单的时间使用默认的EventHandler和EventArgs。
3、派生一个自定义EventArgs类,以提供附加数据。
4、使用现有的CancelEventArgs类,以允许事件订阅人控制事件。

六、对象组合
1.在明明空间内部声明类型,不要使用默认命名空间。
2、不要声明超过带有7个参数的方法,而是重构或考虑传递结构或类。
3、不要使用new关键字隐藏派生类型的成员。
4、在重写中调用基类构造函数或基本实现时,只使用base关键字。
5、考虑使用方法重写,而不是params属性。
6、使用枚举变量或参数值之前始终进行验证。它们可能包含基本枚举类型(默认int)支持的任何值。
7、对提供Close()或Dispose()的类调用Close()或Dispose()。
8、用using语句包括Idisosable对象的实例化,以确保自动调用Dispose()。
9、在引用外部资源的类上实现Idisposable接口和模式。

 


第五部分  对象模型设计


1、优先使用委托而不是继承。

2、以最简单的步骤完成有效的操作,然后在时间允许时进行重构。

3、始终将表示层与业务逻辑层分开。

4、始终优先使用接口而不是抽象类。

5、尽量在适当的地方将设计模式名称附加到类名。

6、如果设计和测试成员是为了方便扩展,则使该成员为虚(virtual)成员。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值