.NET代码编写规范 整理
.NET代码编写规范 整理
.NET代码编写规范 - [ASP.NET]
2009-02-26 | Tag:
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明    
http://lenspe.blogbus.com/logs/35762383.html
下面是根据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是编译时赋值的
.NET代码编写规范 整理的更多相关文章
- 代码编写规范说明书(c#.net与asp.net)
		
代码编写规范说明书(c#.net与asp.net) 目 录1 目的2 范围3 注释规范3.1 概述3.2 自建代码文件注释3.3 模块(类)注释3.4 类属性注释3.5 方法注释3.6 代码间注释4 ...
 - Python代码编写规范
		
Python代码编写规范 编码: a) 如无特殊情况,文件一律使用UTF-8编码 b) 如无需特殊情况,文件头部必须加入#-*-coding:utf-8-*- 缩进 a) 统一 ...
 - Java学习---Java代码编写规范
		
编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规 ...
 - PHP|PHP之代码编写规范
		
PHP之代码编写规范 一.编辑器设置 1.使用Tab缩进(四个空格),不要直接使用空格 2.文件编码格式 二.命名设置 1.公共库名称空间 2.变量命名 2.1.所有字母都使用小写 2.2.首字母根据 ...
 - Java代码编写规范(转载)
		
编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规 ...
 - Java代码编写规范(不是标准规范,自行整理,无须纠结)
		
最近回过头来给以前的项目增加功能,发现之前写的注释非常不全,代码也非常的不整洁,有些地方写的''窝七八烂的,看着很不舒服:又恰好经理最近也经常跟我提起代码规范,我们就讨论了一下代码规范的重要性和必要性 ...
 - php 代码编写规范
		
1 编写目的为了更好的提高技术部的工作效率,保证开发的有效性和合理性,并可最大程度的提高程序代码的可读性和可重复利用性,指定此规范.开发团队根据自己的实际情况,可以对本规范进行补充或裁减. 2 整体要 ...
 - 代码编写规范Asp.Net(c#)
		
1 目的 为了统一公司软件开发的设计过程中关于代码编写时的编写规范和具体开发工作时的编程规范,保证代码的一致性,便于交流和维护,特制定此规范. 2 范围 本规范适用于开发组 ...
 - python 代码编写规范
		
一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车.3 类 ...
 
随机推荐
- 【原创】海量数据处理问题(一) ---- 外排,堆排,K查找的应用
			
这篇博客源自对一个内存无法处理的词频统计问题的思考,最后给出的解决办法是自己想的,可以肯定这不是最好的解法.但是通过和同学的讨论,仍然感觉这是一个有意义及有意思的问题,所以和大家分享与探讨. 如果有误 ...
 - ios 应用剖析
			
在创建HelloWorld的过程中,生成了很多文件(展开Xcode左边的项目导航视图可以看到,如图2-8所示),它们各自的作用是什么?彼此间又是怎样的一种关系呢? 图2-8 项目导航视图 如图2-8所 ...
 - 转载 .htaccess文件RewriteRule语法规则
			
详见: http://blog.csdn.net/scchary/article/details/40045807 # -- 位于行首时表示注释. [F] -- Forbidden( ...
 - DOCTYPE, HTML和XHTML, Strict DTD和Transitional DTD, Quirks Mode和Standard Mode
			
在HTML里面声明DOCTYPE一般会有以下几种: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
 - 函数buf_LRU_search_and_free_block
			
/******************************************************************//** Try to free a replaceable bl ...
 - BZOJ2140: 稳定婚姻
			
题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v ...
 - 使用Amoeba 实现MySQL DB 读写分离
			
Amoeba(变形虫)项目是一个开源框架,于2008年开始发布一款 Amoeba for Mysql软件: 这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQ ...
 - 算法 后减前最大值,zt
			
一个人知道未来n天的每天股票的价格,请你给出一个算法,使得这个人从哪天买入,哪天卖出能获得最大的收益. 问题实际上就是求一个数组后面元素减前面元素的最大值 #include <stdio.h&g ...
 - MEF技术
			
MEF 是一个使开发人员能够创建“插件式应用程序”的技术,这里的“插件”是指在应用程序部署后开发人员能够通过开发“插件”来扩展应用程序功能.但不同之处是使用MEF框架您在系统设计阶段不需要考虑在应用程 ...
 - linux 打开远程samba服务器
			
sudo mount -t cifs //10.104.*.*data /home/leeyoung/samba/ -o username=123,password=123