下面是根据FxCop整理的.NET代码编写规范,仅供参考。
一、 Design(设计)
1 . Abstract types should not have constructors
抽象类不应该声明构造方法
2 . Assemblies should have valid strong names
程序集应该具有强名称
3 . Avoid empty interfaces
避免使用空的接口
4 . Avoid excessive parameters on generic types
避免在泛型类中使用过多的类型参数
5 . Avoid namespaces with few types
避免让名字空间含有过少的类型
6 . Avoid out parameters
避免使用 out类型的参数
7 . Collections should implement generic interface
集合类应该实现泛型接口
8 . Consider passing base types as parameters
尽量使用基本类型作为参数
9 . Declare event handlers correctly
正确的声明事件处理器,事件处理器不应该具有返回值
10 . Declare types in namespaces
应该在名字空间里面定义类型,而不是外面
11 . Default parameters should not be used
不应该使用参数默认值(C#没有参数默认值)
12 . Define accessors for attribute arguments
应该为特性(特性)的构造方法参数定义访问器,其名字跟构造方法参数仅首字母大小写不一样
13 . Do not catch general exception types
不要捕捉普通的异常(即System.Exception)
14 . Do not declare protected members in sealed types
不要在封闭类型中定义受保护的成员
15 . Do not declare static members on generic types
不要在泛型类型中使用静态成员
16 . Do not declare virtual members in sealed types
不要在封闭类型中定义虚成员
17 . Do not declare visible instance fields
不要定义可见的( public / internal )实例域变量
18 . Do not expose generic lists
不要直接暴露范型表
19 . Do not hide base class methods
不要隐藏(使用或者不使用new)基类的方法
20 . Do not nest generic types in member signatures
不要在成员的签名(参数或者返回值)中嵌套泛型类
21 . Do not override operator equals on reference types
不要在引用类型中重载 == 操作符
22 . Do not pass types by reference
不要使用引用( ref or out )传递类型
23 . Enum Storage should be Int32
枚举应该是 Int32 类型的
24 . Enumerators should be strongly typed
枚举器应该是强类型的
25 . Enums should have zero value
枚举应该具有0值
26 . Generic methods should provide type parameter
泛型类的方法应该提供类型参数
27 . ICollection implementations have strongly typed members
集合接口的实现中应该使用强类型的成员
28 . Implement standard exception constructors
自定义的异常应该实现异常类的四个标准构造方法
29 . Indexers should not be multidimensional
索引不应该是多维的
30 . Interface methods should be callable by child types
接口方法应该可以被子类调用
31 . Lists are strongly typed
表应该是强类型的
32 . Mark assemblies with assembly version
用程序集版本标示程序集
33 . Mark assemblies with CLSCompliant
使用CLSCompliant特性标示程序集
34 . Mark assemblies with ComVisible
使用 System.Runtime.InteropServices.ComVisibleAttribute 特性标示程序集
35 . Mark attributes with AttributeUsageAttribute
使用 AttributeUsageAttribute 特性标示特性类
36 . Mark enums with FlagsAttribute
含有组合的枚举应该使用FlagsAttribute特性标示,相反则不应该
37 . Members should not expose certain concrete types
成员(返回值或者参数)不应该暴露具体类型,尽量使用接口
38 . Move pinvokes to native methods class
将调用移到本地方法类(不是很理解)
39 . Nested types should not be visible
嵌套类型不应该是可见的
40 . Override methods on comparable types
可比较类型应该重写 equals 等方法
41 . Override operator equals on overriding add and subtract
在重写 + 和 - 运算的时候应该同时重写 == 操作符
42 . Properties should not be write only
属性不应该是只写的
43 . Provide ObsoleteAttribute message
过时的成员应该使用ObsoleteAttribute特性标示,并提供相应的Message提示使用者
44 . Replace repetitive arguments with params array
使用参数数组代替重复的参数
45 . Static holder types should be sealed
仅含有静态成员的类型应该声明为封闭的
46 . Static holder types should not have constructors
仅含有静态成员的类型应该具有构造方法
47 . String uri overloads call system uri overloads
使用string类型的uri参数的重载应调用系统的使用URI类型参数的重载
48 . Types should not extend certain base types
类型不应该从具体的类(已经过派生的类)继承,比如异常类不应该从ApplicationException继承,而应该从System.Exception继承
49 . Types that own disposable fields should be disposable
含有可释放成员的类型应该是可以释放的(实现IDisposable接口)
50 . Types that own native resources should be disposable
使用了非托管资源的类型应该是可以释放的(实现IDisposable接口)
51 . Uri parameters should not be strings
Uri 参数不应该是string类型的
52 . Uri properties should not be strings
Uri 属性不应该是string类型的
53 . Uri return values should not be strings
Uri 类型的返回值不应该是string类型的
54 . Use events where appropriate
在适当的时候使用事件
55 . Use generic event handler instances
使用泛型的事件处理器实例
56 . Use generics where appropriate
在适当的时候使用范型
57 . Use integral or string argument for indexers
索引器应该使用整数或者字符串类型的参数
58 . Use properties where appropriate
在适当的时候使用属性(而不是以Get或者Set开头的方法)
59 . Validate arguments of public methods
对public的方法的参数应该在方法开头处进行检验(比如是否为null的检验)
二、 Globalization(全球化)
1 . Avoid duplicate accelerators
避免在顶层控件中使用重复的快捷键(加速键)
2 . Do not hardcode locale specific strings
不要对本地的特殊字符串(比如特殊的系统路径)进行硬编码
3 . Do not pass literals as localized parameters
不要把文本作为需要本地化的参数直接传递(尽量使用资源文件)
4 . Set locale for data types
为某些数据类型设定区域和语言属性(DataSet和DataTable的locale属性)
5 . Specify CultureInfo
指定文化信息(地域和语言信息),在调用接受System.Globalization.CultureInfo 类型参数的方法时应该传递文化信息
6 . Specify IFormatProvider
指定格式供应器,在调用接受System.IFormatProvider 类型参数的方法时应该传递格式供应器
7 . Specify MessageBoxOptions
指定MessageBox的选项,在调用MessageBox.Show方法时应该传递System.Windows.Forms.MessageBoxOptions,特别在某些从右向左阅读习惯的区域
三、 Interoperability(互操作性)
1 . Auto layout types should not be ComVisible
自动布局的类型不应该对Com可见(设置System.Runtime.InteropServices.ComVisibleAttribute特性为false)
2 . Avoid int64 arguments for VB6 clients
避免使用int64类型,如果成员可能被Visual Basic 6 COM clients调用
3 . Avoid non - public fields in ComVisible value types
避免在一个标记有ComVisible特性的值类型里面包含非公有的实例域
4 . Avoid overloads in ComVisible interfaces
避免在一个标记有ComVisible特性的接口内声明重载
5 . Avoid static members in ComVisible types
避免在一个标记有ComVisible特性的类型
6 . Call GetLastError immediately after pinvoke
进行pinvoke以后应该立即使用GetLastError读取错误信息
7 . Com registration methods should be matched
Com注册方法(标记有System.Runtime.InteropServices.ComRegisterFunctionAttribute特性的方法)应该是配对的(同时具有一个标记有System.Runtime.InteropServices.ComUnregisterFunctionAttribute的方法与之匹配)
8 . Com registration methods should not be visible
Com注册方法应该是不可见的
9 . Com visible type base types should be ComVisible
标记有ComVisible特性的类型的基类同样应从标记有ComVisible特性的类继承
10 . Com visible types should be creatable
标记有ComVisible特性的类型应该能够使用默认构造器构造
11 . Declare PInvokes correctly
正确定义PInvokes
12 . Do not use AutoDual ClassInterfaceType
不要把System.Runtime.InteropServices.ClassInterfaceAttribute特性的值设置为System.Runtime.InteropServices.ClassInterfaceType.AutoDual
13 . Mark boolean pinvoke arguments with MarshalAs
布尔型的pinvoke参数应该使用System.Runtime.InteropServices.MarshalAsAttribute特性标记
14 . Mark ComSource interfaces as IDispatch
将System.Runtime.InteropServices.ComSourceInterfacesAttribute特性标记为System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIDispatch.
15 . PInvoke entry points should exist
Pinvoke应该存在入口点
16 . PInvokes should not be visible
Pinvoke应该是可见的
四、 Naming(命名)
1 . Avoid language specific type names in parameters
避免在参数中使用与特定语言相关的类型(用Uint16代替Ushort)
2 . Avoid type names in parameters
避免在外部可见的参数中使用类型名
3 . Compound words should be cased correctly
复合词应该使用正确的大小写(不要将Mutlipart写成MultiPart,也不要将ToolBar写成Toolbar,FileName写成Filename)
4 . Do not name enum values ' Reserved '
不要在枚举值中使用保留字
5 . Do not prefix enum values with type name
不要在枚举值使用类型前缀(比如不要使用Digital之类的前缀)
6 . Events should not have before or after prefix
事件的名称不应该包含before和after前缀(尽量使用ing和ed的后缀)
7 . Flags enums should have plural names
标记有System.FlagsAttribute特性的枚举应该使用复数形式的名称
8 . Identifiers should be cased correctly
标示符(名字空间、类名、属性名、接口名、方法名等)应该使用正确的大小写(通常以大写开头,以后的每个单词都首字母大写)
9 . Identifiers should be spelled correctly
标示符应该可以被正确的划分为不同的单词
10 . Identifiers should differ by more than case
标示符应该不止有大小写上的不同(因为某些语言是不区分大小写的)
11 . Identifiers should have correct prefix
标示符应该使用正确的前缀(接口应该使用字母I开头)
12 . Identifiers should have correct suffix
标示符应该使用正确的后缀
System.Attribute / Attribute
System.EventArgs / EventArgs
System.Exception / Exception
System.Collections.ICollection / Collection
System.Collections.IDictionary / Dictionary
System.Collections.IEnumerable / Collection
System.Collections.Queue / Collection or Queue
System.Collections.Stack / Collection or Stack
System.Collections.Generic.ICollection / Collection
System.Collections.Generic.IDictionary / Dictionary
System.Data.DataSet / DataSet
System.Data.DataTable / Collection or DataTable
System.IO.Stream / Stream
System.Security.IPermission / Permission
System.Security.Policy.IMembershipCondition / Condition
An event - handlerdelegate. / EventHandler
13 . Identifiers should not contain underscores
标示符不应该使用下划线
14 . Identifiers should not have incorrect prefix
标示符不应该使用不正确的前缀(比如不应使用一个字母作为前缀)
15 . Identifiers should not have incorrect suffix
标示符不应该使用不正确的后缀(不要在不正确的地方使用12中提及的后缀名,和Delegate、Enum、Flags for an enumeration、Impl等后缀名)
16 . Identifiers should not match keywords
标示符不应该与系统关键字冲突
17 . Long acronyms should be pascal - cased
长度大于等于3的缩写词应该使用pascal的命名规则,即首字母大写
18 . Only FlagsAttribute enums should have plural names
只有标记有System.FlagsAttribute特性的枚举的名称才应该使用复数,其他时候应该使用单数
19 . Parameter names should match base declaration
派生项的参数名应该同基项相吻合(派生类重写或实现的方法应该同基项具有相同的参数名)
20 . Parameter names should not match member names
方法的参数名不应该同类或接口的成员名一样
21 . Property names should not match get methods
属性名字不应该同Get开头的方法的名称的后半部分相同
22 . Resource string compound words should be cased correctly
包含符合单词的资源字符串应该使用正确的大小写(每个单词的首字母大写)
23 . Resource strings should be spelled correctly
资源字符串应该正确的拼写
24 . Short acronyms should be uppercase
短的首字母缩写词应该全部大写(比如DB,CR)
25 . Type names should not match namespaces
类型的名字不应该与名字空间的名字相同
26 . Use preferred terms
优先使用某些项目或者名称,以下这些,后者为优先使用的
ComPlus / EnterpriseServices
Cancelled / Canceled
Indices / Indexes
LogIn / LogOn
LogOut / LogOff
SignOn / SignIn
SignOff / SignOut
Writeable / Writable
五、 Performance(性能规则)
1 . Avoid calls that require unboxing
避免调用一个方法,它返回object类型,而你需要的是一个值类型(需要对返回值进行拆箱操作)
2 . Avoid costly calls where possible
尽可能的避免进行代价高昂的调用
3 . Avoid excessive locals
避免使用过多的局部变量(多于64个,部分可能是编译器生成的)
4 . Avoid uncalled private code
避免声明在程序集内从来未被调用的私有成员(private和internal),以下除外:
明确的接口成员
静态构造方法
静态的Main方法(不含参数或仅包含一个string数组的参数的)
序列化构造方法
标记有System.Runtime.InteropServices.ComRegisterFunctionAttribute或者 System.Runtime.InteropServices.ComUnregisterFunctionAttribute.特性的
重写的方法
5 . Avoid uninstantiated internal classes
避免声明不会被实例化的内部类,以下情况除外
值类型
抽象类型
枚举
委托
编译器生成的数组类型
仅含有静态成员的内部类
6 . Avoid unnecessary string creation
避免创建不必要的string实例(犹指‘通过ToLower和ToUpper创建的string’),含以下情况
对于同一个string实例多次调用ToLower和ToUpper(建议:将返回值赋给一个局部变量,然后使用此局部变量)
使用equals,’ == ‘, != 比较‘通过ToLower和ToUpper创建的string’(建议:使用String.Compare比较)
向一个System.Collections.Specialized.HybridDictionary类型的成员传递‘通过ToLower和ToUpper创建的string’(建议:HybridDictionary具有一个指示是否忽略大小写的参数的构造方法重载,使用此重载并传递一个true值进去)
7 . Avoid unsealed attributes
避免声明未封闭的特性(attributes)(建议:声明为sealed / NotInheritable - vb.net或者abstract)
8 . Avoid unused parameters
避免在方法声明中包含不会被使用的参数,以下情况除外
代理引用的方法
作为事件处理程序的方法
抽象方法( abstract )
虚方法( virtual )
重写的方法( override )
外部方法( extern )
9 . Dispose methods should call SuppressFinalize
Dispose方法应该调用SuppressFinalize,以请求系统不要调用其Finalize方法
10 . Do not call properties that clone values in loops
不要在循环中使用‘返回一个Clone的对象的属性’(每次返回‘引用不同’的对象,会导致创建大量的相同的对象)
11 . Do not cast unnecessarily
不要进行不必要的类型转换(特别是尝试性的转换,建议:在转换前可以使用is操作符来判断转换能够成功)
12 . Do not concatenate strings inside loops
不要在循环内串联string(建议:使用StringBuilder代替string)
13 . Do not ignore method results
不要忽略方法的返回值(通常调用string的方法会返回新的string)
14 . Do not initialize unnecessarily
不要进行不必要的初始化(比如将类成员初始化为它的默认值)
15 . Initialize reference type static fields inline
在静态成员声明的时候直接初始化或者调用静态方法初始化(不要使用静态构造方法来初始化静态成员,静态构造方法会影响性能),以下情况除外:
初始化对全局状态的影响是代价高昂的,而且类型在使用前不需要进行初始化的
在不需要访问该类型的静态成员的情况下,全局状态的影响就可以被访问到的
16 . Override equals and operator equals on value types
对于公有的值类型,重写equals方法和’ == ‘操作符(如果你期望用户对实例进行比较或者排序,或者作为哈希表的键)
17 . Prefer jagged arrays over multidimensional
使用锯齿形数组代替多维数组(当数组各元素的长度可能不一致时)
注意:公共语言规范(CLS)不支持锯齿数组
18 . Properties should not return arrays
公有类型的属性不应该返回数组(数组类型的属性无法进行写保护,即使是只读的,除非每次返回不同的拷贝,但是这样会让调用者产生迷惑。建议:改成方法)
19 . Remove empty finalizers
移除空的终结器
20 . Remove unused locals
移除未使用过的局部变量
21 . Test for empty strings using string length
使用length属性测试字符串是否为空(原因:不要使用 == ””、 == String..Empty、Equals(“”)等方法,使用Length属性的效率是最高的; null == empty比较不会抛出异常;在DotNetFrameWork2里面可以使用IsNullOrEmpty方法来判断字符串是否为null或者empty)
22 . Use literals where appropriate
在适当的时候使用const代替static readonly (const是编译时赋值的)
一、 Design(设计)
1 . Abstract types should not have constructors
抽象类不应该声明构造方法
2 . Assemblies should have valid strong names
程序集应该具有强名称
3 . Avoid empty interfaces
避免使用空的接口
4 . Avoid excessive parameters on generic types
避免在泛型类中使用过多的类型参数
5 . Avoid namespaces with few types
避免让名字空间含有过少的类型
6 . Avoid out parameters
避免使用 out类型的参数
7 . Collections should implement generic interface
集合类应该实现泛型接口
8 . Consider passing base types as parameters
尽量使用基本类型作为参数
9 . Declare event handlers correctly
正确的声明事件处理器,事件处理器不应该具有返回值
10 . Declare types in namespaces
应该在名字空间里面定义类型,而不是外面
11 . Default parameters should not be used
不应该使用参数默认值(C#没有参数默认值)
12 . Define accessors for attribute arguments
应该为特性(特性)的构造方法参数定义访问器,其名字跟构造方法参数仅首字母大小写不一样
13 . Do not catch general exception types
不要捕捉普通的异常(即System.Exception)
14 . Do not declare protected members in sealed types
不要在封闭类型中定义受保护的成员
15 . Do not declare static members on generic types
不要在泛型类型中使用静态成员
16 . Do not declare virtual members in sealed types
不要在封闭类型中定义虚成员
17 . Do not declare visible instance fields
不要定义可见的( public / internal )实例域变量
18 . Do not expose generic lists
不要直接暴露范型表
19 . Do not hide base class methods
不要隐藏(使用或者不使用new)基类的方法
20 . Do not nest generic types in member signatures
不要在成员的签名(参数或者返回值)中嵌套泛型类
21 . Do not override operator equals on reference types
不要在引用类型中重载 == 操作符
22 . Do not pass types by reference
不要使用引用( ref or out )传递类型
23 . Enum Storage should be Int32
枚举应该是 Int32 类型的
24 . Enumerators should be strongly typed
枚举器应该是强类型的
25 . Enums should have zero value
枚举应该具有0值
26 . Generic methods should provide type parameter
泛型类的方法应该提供类型参数
27 . ICollection implementations have strongly typed members
集合接口的实现中应该使用强类型的成员
28 . Implement standard exception constructors
自定义的异常应该实现异常类的四个标准构造方法
29 . Indexers should not be multidimensional
索引不应该是多维的
30 . Interface methods should be callable by child types
接口方法应该可以被子类调用
31 . Lists are strongly typed
表应该是强类型的
32 . Mark assemblies with assembly version
用程序集版本标示程序集
33 . Mark assemblies with CLSCompliant
使用CLSCompliant特性标示程序集
34 . Mark assemblies with ComVisible
使用 System.Runtime.InteropServices.ComVisibleAttribute 特性标示程序集
35 . Mark attributes with AttributeUsageAttribute
使用 AttributeUsageAttribute 特性标示特性类
36 . Mark enums with FlagsAttribute
含有组合的枚举应该使用FlagsAttribute特性标示,相反则不应该
37 . Members should not expose certain concrete types
成员(返回值或者参数)不应该暴露具体类型,尽量使用接口
38 . Move pinvokes to native methods class
将调用移到本地方法类(不是很理解)
39 . Nested types should not be visible
嵌套类型不应该是可见的
40 . Override methods on comparable types
可比较类型应该重写 equals 等方法
41 . Override operator equals on overriding add and subtract
在重写 + 和 - 运算的时候应该同时重写 == 操作符
42 . Properties should not be write only
属性不应该是只写的
43 . Provide ObsoleteAttribute message
过时的成员应该使用ObsoleteAttribute特性标示,并提供相应的Message提示使用者
44 . Replace repetitive arguments with params array
使用参数数组代替重复的参数
45 . Static holder types should be sealed
仅含有静态成员的类型应该声明为封闭的
46 . Static holder types should not have constructors
仅含有静态成员的类型应该具有构造方法
47 . String uri overloads call system uri overloads
使用string类型的uri参数的重载应调用系统的使用URI类型参数的重载
48 . Types should not extend certain base types
类型不应该从具体的类(已经过派生的类)继承,比如异常类不应该从ApplicationException继承,而应该从System.Exception继承
49 . Types that own disposable fields should be disposable
含有可释放成员的类型应该是可以释放的(实现IDisposable接口)
50 . Types that own native resources should be disposable
使用了非托管资源的类型应该是可以释放的(实现IDisposable接口)
51 . Uri parameters should not be strings
Uri 参数不应该是string类型的
52 . Uri properties should not be strings
Uri 属性不应该是string类型的
53 . Uri return values should not be strings
Uri 类型的返回值不应该是string类型的
54 . Use events where appropriate
在适当的时候使用事件
55 . Use generic event handler instances
使用泛型的事件处理器实例
56 . Use generics where appropriate
在适当的时候使用范型
57 . Use integral or string argument for indexers
索引器应该使用整数或者字符串类型的参数
58 . Use properties where appropriate
在适当的时候使用属性(而不是以Get或者Set开头的方法)
59 . Validate arguments of public methods
对public的方法的参数应该在方法开头处进行检验(比如是否为null的检验)
二、 Globalization(全球化)
1 . Avoid duplicate accelerators
避免在顶层控件中使用重复的快捷键(加速键)
2 . Do not hardcode locale specific strings
不要对本地的特殊字符串(比如特殊的系统路径)进行硬编码
3 . Do not pass literals as localized parameters
不要把文本作为需要本地化的参数直接传递(尽量使用资源文件)
4 . Set locale for data types
为某些数据类型设定区域和语言属性(DataSet和DataTable的locale属性)
5 . Specify CultureInfo
指定文化信息(地域和语言信息),在调用接受System.Globalization.CultureInfo 类型参数的方法时应该传递文化信息
6 . Specify IFormatProvider
指定格式供应器,在调用接受System.IFormatProvider 类型参数的方法时应该传递格式供应器
7 . Specify MessageBoxOptions
指定MessageBox的选项,在调用MessageBox.Show方法时应该传递System.Windows.Forms.MessageBoxOptions,特别在某些从右向左阅读习惯的区域
三、 Interoperability(互操作性)
1 . Auto layout types should not be ComVisible
自动布局的类型不应该对Com可见(设置System.Runtime.InteropServices.ComVisibleAttribute特性为false)
2 . Avoid int64 arguments for VB6 clients
避免使用int64类型,如果成员可能被Visual Basic 6 COM clients调用
3 . Avoid non - public fields in ComVisible value types
避免在一个标记有ComVisible特性的值类型里面包含非公有的实例域
4 . Avoid overloads in ComVisible interfaces
避免在一个标记有ComVisible特性的接口内声明重载
5 . Avoid static members in ComVisible types
避免在一个标记有ComVisible特性的类型
6 . Call GetLastError immediately after pinvoke
进行pinvoke以后应该立即使用GetLastError读取错误信息
7 . Com registration methods should be matched
Com注册方法(标记有System.Runtime.InteropServices.ComRegisterFunctionAttribute特性的方法)应该是配对的(同时具有一个标记有System.Runtime.InteropServices.ComUnregisterFunctionAttribute的方法与之匹配)
8 . Com registration methods should not be visible
Com注册方法应该是不可见的
9 . Com visible type base types should be ComVisible
标记有ComVisible特性的类型的基类同样应从标记有ComVisible特性的类继承
10 . Com visible types should be creatable
标记有ComVisible特性的类型应该能够使用默认构造器构造
11 . Declare PInvokes correctly
正确定义PInvokes
12 . Do not use AutoDual ClassInterfaceType
不要把System.Runtime.InteropServices.ClassInterfaceAttribute特性的值设置为System.Runtime.InteropServices.ClassInterfaceType.AutoDual
13 . Mark boolean pinvoke arguments with MarshalAs
布尔型的pinvoke参数应该使用System.Runtime.InteropServices.MarshalAsAttribute特性标记
14 . Mark ComSource interfaces as IDispatch
将System.Runtime.InteropServices.ComSourceInterfacesAttribute特性标记为System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIDispatch.
15 . PInvoke entry points should exist
Pinvoke应该存在入口点
16 . PInvokes should not be visible
Pinvoke应该是可见的
四、 Naming(命名)
1 . Avoid language specific type names in parameters
避免在参数中使用与特定语言相关的类型(用Uint16代替Ushort)
2 . Avoid type names in parameters
避免在外部可见的参数中使用类型名
3 . Compound words should be cased correctly
复合词应该使用正确的大小写(不要将Mutlipart写成MultiPart,也不要将ToolBar写成Toolbar,FileName写成Filename)
4 . Do not name enum values ' Reserved '
不要在枚举值中使用保留字
5 . Do not prefix enum values with type name
不要在枚举值使用类型前缀(比如不要使用Digital之类的前缀)
6 . Events should not have before or after prefix
事件的名称不应该包含before和after前缀(尽量使用ing和ed的后缀)
7 . Flags enums should have plural names
标记有System.FlagsAttribute特性的枚举应该使用复数形式的名称
8 . Identifiers should be cased correctly
标示符(名字空间、类名、属性名、接口名、方法名等)应该使用正确的大小写(通常以大写开头,以后的每个单词都首字母大写)
9 . Identifiers should be spelled correctly
标示符应该可以被正确的划分为不同的单词
10 . Identifiers should differ by more than case
标示符应该不止有大小写上的不同(因为某些语言是不区分大小写的)
11 . Identifiers should have correct prefix
标示符应该使用正确的前缀(接口应该使用字母I开头)
12 . Identifiers should have correct suffix
标示符应该使用正确的后缀
System.Attribute / Attribute
System.EventArgs / EventArgs
System.Exception / Exception
System.Collections.ICollection / Collection
System.Collections.IDictionary / Dictionary
System.Collections.IEnumerable / Collection
System.Collections.Queue / Collection or Queue
System.Collections.Stack / Collection or Stack
System.Collections.Generic.ICollection / Collection
System.Collections.Generic.IDictionary / Dictionary
System.Data.DataSet / DataSet
System.Data.DataTable / Collection or DataTable
System.IO.Stream / Stream
System.Security.IPermission / Permission
System.Security.Policy.IMembershipCondition / Condition
An event - handlerdelegate. / EventHandler
13 . Identifiers should not contain underscores
标示符不应该使用下划线
14 . Identifiers should not have incorrect prefix
标示符不应该使用不正确的前缀(比如不应使用一个字母作为前缀)
15 . Identifiers should not have incorrect suffix
标示符不应该使用不正确的后缀(不要在不正确的地方使用12中提及的后缀名,和Delegate、Enum、Flags for an enumeration、Impl等后缀名)
16 . Identifiers should not match keywords
标示符不应该与系统关键字冲突
17 . Long acronyms should be pascal - cased
长度大于等于3的缩写词应该使用pascal的命名规则,即首字母大写
18 . Only FlagsAttribute enums should have plural names
只有标记有System.FlagsAttribute特性的枚举的名称才应该使用复数,其他时候应该使用单数
19 . Parameter names should match base declaration
派生项的参数名应该同基项相吻合(派生类重写或实现的方法应该同基项具有相同的参数名)
20 . Parameter names should not match member names
方法的参数名不应该同类或接口的成员名一样
21 . Property names should not match get methods
属性名字不应该同Get开头的方法的名称的后半部分相同
22 . Resource string compound words should be cased correctly
包含符合单词的资源字符串应该使用正确的大小写(每个单词的首字母大写)
23 . Resource strings should be spelled correctly
资源字符串应该正确的拼写
24 . Short acronyms should be uppercase
短的首字母缩写词应该全部大写(比如DB,CR)
25 . Type names should not match namespaces
类型的名字不应该与名字空间的名字相同
26 . Use preferred terms
优先使用某些项目或者名称,以下这些,后者为优先使用的
ComPlus / EnterpriseServices
Cancelled / Canceled
Indices / Indexes
LogIn / LogOn
LogOut / LogOff
SignOn / SignIn
SignOff / SignOut
Writeable / Writable
五、 Performance(性能规则)
1 . Avoid calls that require unboxing
避免调用一个方法,它返回object类型,而你需要的是一个值类型(需要对返回值进行拆箱操作)
2 . Avoid costly calls where possible
尽可能的避免进行代价高昂的调用
3 . Avoid excessive locals
避免使用过多的局部变量(多于64个,部分可能是编译器生成的)
4 . Avoid uncalled private code
避免声明在程序集内从来未被调用的私有成员(private和internal),以下除外:
明确的接口成员
静态构造方法
静态的Main方法(不含参数或仅包含一个string数组的参数的)
序列化构造方法
标记有System.Runtime.InteropServices.ComRegisterFunctionAttribute或者 System.Runtime.InteropServices.ComUnregisterFunctionAttribute.特性的
重写的方法
5 . Avoid uninstantiated internal classes
避免声明不会被实例化的内部类,以下情况除外
值类型
抽象类型
枚举
委托
编译器生成的数组类型
仅含有静态成员的内部类
6 . Avoid unnecessary string creation
避免创建不必要的string实例(犹指‘通过ToLower和ToUpper创建的string’),含以下情况
对于同一个string实例多次调用ToLower和ToUpper(建议:将返回值赋给一个局部变量,然后使用此局部变量)
使用equals,’ == ‘, != 比较‘通过ToLower和ToUpper创建的string’(建议:使用String.Compare比较)
向一个System.Collections.Specialized.HybridDictionary类型的成员传递‘通过ToLower和ToUpper创建的string’(建议:HybridDictionary具有一个指示是否忽略大小写的参数的构造方法重载,使用此重载并传递一个true值进去)
7 . Avoid unsealed attributes
避免声明未封闭的特性(attributes)(建议:声明为sealed / NotInheritable - vb.net或者abstract)
8 . Avoid unused parameters
避免在方法声明中包含不会被使用的参数,以下情况除外
代理引用的方法
作为事件处理程序的方法
抽象方法( abstract )
虚方法( virtual )
重写的方法( override )
外部方法( extern )
9 . Dispose methods should call SuppressFinalize
Dispose方法应该调用SuppressFinalize,以请求系统不要调用其Finalize方法
10 . Do not call properties that clone values in loops
不要在循环中使用‘返回一个Clone的对象的属性’(每次返回‘引用不同’的对象,会导致创建大量的相同的对象)
11 . Do not cast unnecessarily
不要进行不必要的类型转换(特别是尝试性的转换,建议:在转换前可以使用is操作符来判断转换能够成功)
12 . Do not concatenate strings inside loops
不要在循环内串联string(建议:使用StringBuilder代替string)
13 . Do not ignore method results
不要忽略方法的返回值(通常调用string的方法会返回新的string)
14 . Do not initialize unnecessarily
不要进行不必要的初始化(比如将类成员初始化为它的默认值)
15 . Initialize reference type static fields inline
在静态成员声明的时候直接初始化或者调用静态方法初始化(不要使用静态构造方法来初始化静态成员,静态构造方法会影响性能),以下情况除外:
初始化对全局状态的影响是代价高昂的,而且类型在使用前不需要进行初始化的
在不需要访问该类型的静态成员的情况下,全局状态的影响就可以被访问到的
16 . Override equals and operator equals on value types
对于公有的值类型,重写equals方法和’ == ‘操作符(如果你期望用户对实例进行比较或者排序,或者作为哈希表的键)
17 . Prefer jagged arrays over multidimensional
使用锯齿形数组代替多维数组(当数组各元素的长度可能不一致时)
注意:公共语言规范(CLS)不支持锯齿数组
18 . Properties should not return arrays
公有类型的属性不应该返回数组(数组类型的属性无法进行写保护,即使是只读的,除非每次返回不同的拷贝,但是这样会让调用者产生迷惑。建议:改成方法)
19 . Remove empty finalizers
移除空的终结器
20 . Remove unused locals
移除未使用过的局部变量
21 . Test for empty strings using string length
使用length属性测试字符串是否为空(原因:不要使用 == ””、 == String..Empty、Equals(“”)等方法,使用Length属性的效率是最高的; null == empty比较不会抛出异常;在DotNetFrameWork2里面可以使用IsNullOrEmpty方法来判断字符串是否为null或者empty)
22 . Use literals where appropriate
在适当的时候使用const代替static readonly (const是编译时赋值的)