代码审查工具FxCop建议采用的规则总结
续接:
代码走查工具篇FxCop的规则总结与翻译_Part1
代码走查工具篇FxCop的规则总结与翻译_Part2
本篇结合我的实际工作需要,总结了一份在实际工作中采纳的规则项目,总结不妥之处,还请多海涵。
一、Design Rules(设计规约)
1、AbstractTypesShouldNotHaveConstructors CA1012
4、AvoidExcessiveParametersOnGenericTypes CA1005
避免泛型类型的参数过多,两个是一个分界线,最好不要超过两个。
7、CollectionsShouldImplementGenericInterface CA1010
集合应该实现泛型接口,常见的泛型接口为: System.Collections.Generic.IEnumerable<T>
System.Collections.Generic.ICollection<T>
System.Collections.Generic.IList<T>
8、ConsiderPassingBaseTypesAsParameters CA1011
某方法声明包含一个派生类型的形参,且该方法仅调用该参数的基类型的成员的时候参数要定义成基类型,这样这个方法使用面会更广,任何这个基类的子类都可以当做实参传进来。
9、DeclareEventHandlersCorrectly CA1009
10、DeclareTypesInNamespaces CA1050
应在命名空间内声明类型以避免名称冲突,并作为一种在对象层次结构中组织相关类型的方式。位于任何命名的命名空间之外的类型属于全局命名空间,全局命名空间无法在代码中引用。
11、DefaultParametersShouldNotBeUsed CA1026
为了使.net代码应用面更广,建议不要使用默认参数,如果有这方便的需求可以采取提供默认参数的方法重载来替换使用默认参数的方法
12、DoNotDeclareProtectedMembersInSealedTypes CA1047
不要在密封类型中声明受保护的成员,按照定义,不能从密封类型继承,意味着不能调用密封类型上受保护的方法。
16、DoNotDeclareVirtualMembersInSealedTypes CA1048
不要在密封类型中声明虚拟成员,类型将方法声明为虚方法,使继承类型可以重写虚方法的实现。根据定义,不能从密封类型继承,这使得密封类型上的虚方法没有意义。
17、DoNotDeclareVisibleInstanceFields CA1051
18、DoNotExposeGenericLists CA1002
System.Collections.ObjectModel.Collection<T>
System.Collections.ObjectModel.ReadOnlyCollection<T>
System.Collections.ObjectModel.KeyedCollection<TKey, TItem>
19、DoNotHideBaseClassMethods CA1061
不要隐藏基类方法,如果派生方法的参数签名只是在类型方面有所不同,而且与基方法的参数签名中的对应类型相比,这些类型的派生方式更弱,则基类型中的方法将被派生类型中的同名方法隐藏。
21、DoNotOverloadOperatorEqualsOnReferenceTypes CA1046
不要对引用类型重载相等运算符,对于引用类型,相等运算符的默认实现几乎始终是正确的。默认情况下,仅当两个引用指向同一对象时,它们才相等。
23、DoNotRaiseExceptionsInUnexpectedLocations CA1065
不要在意外的位置引发异常,不应引发异常的方法可分为以下几类:
Property Get 方法;事件访问器方法;Equals 方法;GetHashCode 方法;ToString 方法;静态构造函数;终结器;Dispose 方法;相等运算符;隐式转换运算符。
24、EnumStorageShouldBeInt32 CA1028
All = Monday| Tuesday | Wednesday | Thursday | Friday
EnumeratorsShouldBeStronglyTyped CA1038
25、EnumsShouldHaveZeroValue CA1008
26、ExceptionsShouldBePublic CA1064
27、GenericMethodsShouldProvideTypeParameter CA1004
// This method violates the rule.
public void NotInferredTypeArgument<T>()
// This method satisfies the rule.
public void InferredTypeArgument<T>(T sameAsTypeParameter)
Console.WriteLine(sameAsTypeParameter);
Inference infer = new Inference();
infer.NotInferredTypeArgument<int>();
infer.InferredTypeArgument(3);
28、ICollectionImplementationsHaveStronglyTypedMembers CA1035
29、ImplementIDisposableCorrectly CA1063
30、ImplementStandardExceptionConstructors CA1032
公共 NewException(string, Exception)
受保护或私有的 NewException(SerializationInfo, StreamingContext)
31、IndexersShouldNotBeMultidimensional CA1023
索引器不应是多维的,索引器(即索引属性)应该使用一个索引。多维索引器会大大降低库的可用性。如果设计需要使用多个索引,请重新考虑类型是否代表逻辑数据存储。否则,请使用方法。
32、InterfaceMethodsShouldBeCallableByChildTypes CA1033
33、ListsAreStronglyTyped CA1039
39、MembersShouldNotExposeCertainConcreteTypes CA1059
42、OverloadOperatorEqualsOnOverloadingAddAndSubtract CA1013
43、OverrideMethodsOnComparableTypes CA1036
44、PropertiesShouldNotBeWriteOnly CA1044
45、ProvideObsoleteAttributeMessage CA1041
[Obsolete("Don't use Old CalcUtil1, use New CalcUtil2", true)]
46、ReplaceRepetitiveArgumentsWithParamsArray CA1025
用形参数组替换重复的实参,公共类型中的某个公共或受保护方法具有三个以上的参数,且其后三个参数为相同类型。
47、StaticHolderTypesShouldBeSealed CA1052
该规则假定只包含静态成员的类型没有设计为能被继承,因为该类型不提供可以在派生类型中重写的任何功能。 不希望被继承的类型应使用 sealed 修饰符禁止将其用作基类型。
48、StringUriOverloadsCallSystemUriOverloads CA1057
49、TypesShouldNotExtendCertainBaseTypes CA1058
类型不应扩展某些基类型,外部可见的类型扩展某些基类型。 目前,此规则报告从下列类型派生的类型:
System.Collections.CollectionBase
System.Collections.DictionaryBase
System.Collections.ReadOnlyCollectionBase
52、UriParametersShouldNotBeStrings CA1054
53、UriPropertiesShouldNotBeStrings CA1056
54、UriReturnValuesShouldNotBeStrings CA1055
57、UseGenericsWhereAppropriate CA1007
58、UseIntegralOrStringArgumentForIndexers CA1043
59、UsePropertiesWhereAppropriate CA1024
在适当的时机使用属性,在大多数情况下,属性代表数据,而方法执行操作。 访问属性的方式与访问字段的方式相似,因此使用它们更容易。 如果存在下列条件之一,方法就很适于成为属性:
属性的表现应当与字段一样;如果该方法不是这样,则不应将其更改为属性。 在下列情况下,方法比属性更好;
方法执行耗时的操作。 与设置或获取字段值所需的时间相比,此方法的速度明显较慢;
Get 方法会产生明显副作用。 检索字段的值不会产生任何副作用;
方法是静态的,但返回了调用方可更改的对象。 调用方不能通过检索某字段的值来更改该字段存储的数据;
二、Globalizationrules(区域性规则)
2、DoNotHardcodeLocaleSpecificStrings CA1302
4、SetLocaleForDataTypes CA1306
指定区域语言,系统启动的时候设置一下当前区域语言里的时间格式,yyyy-MM-dd HH:mm:ss 这样每个画面如果没有给定format的话也不会在win7下出现 3/27/2013。
#region 添加了全局的时间格式化代码 at 2013-4-4 15:09:08 by Anders lu
Thread.CurrentThread.CurrentCulture=(CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
Thread.CurrentThread.CurrentCulture.DateTimeFormat.LongDatePattern = "yyyy-MM-dd";
Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortTimePattern = "HH:mm:ss";
Thread.CurrentThread.CurrentCulture.DateTimeFormat.LongTimePattern = "HH:mm:ss";
6、SpecifyIFormatProvider CA1305
四、Mobilityrules(流动性规则)
2、DoNotUseTimersThatPreventPowerStateChanges CA1601
不要以高于每秒一次的频率进行轮询或使用触发频率高于每秒一次的计时器。频率较高的定期活动会使 CPU 处于繁忙状态,并且会干扰具有节能功能(关闭显示器和硬盘)的空闲计时器。
五、Namingrules(命名规则)
1、CompoundWordsShouldBeCasedCorrectly CA1702
3、DoNotPrefixEnumValuesWithTypeName CA1712
不要将类型名用作枚举值的前缀,枚举成员的名称不能以类型名称作为前缀,因为类型信息将由开发工具提供。命名约定为所有针对公共语言运行时的库提供了通用的外观。
4、EventsShouldNotHaveBeforeOrAfterPrefix CA1713
5、FlagsEnumsShouldHavePluralNames CA1714
6、IdentifiersShouldBeCasedCorrectly CA1709
标识符的大小写应当正确,命名约定为所有针对公共语言运行时的库提供了通用的外观。
“ID”是一种导致与该规则冲突的特殊情况。'Id”不是首字母缩略词,而是“identification”的缩写。
7、IdentifiersShouldBeSpelledCorrectly CA1704
标识符应正确拼写,此规则将标识符解析为标记并检查每个标记的拼写。解析算法执行下列转换:
一个新标记以大写字母开头。例如,MyNameIsJoe 被解析为“My”、“Name”、“Is”和“Joe”标记。
对于多个大写字母,最后一个大写字母开始一个新标记。例如,GUIEditor 被解析为“GUI”和“Editor”标记。
移除前导和尾随撇号。例如,“'sender'”被解析为“sender”标记。
下划线表示一个标记的结尾,并被移除。例如,Hello_world 被解析为“Hello”和“world”标记。
嵌入的与号将被移除。例如,for&mat 被解析为“format”标记。
默认情况下,使用拼写检查器的英语 (en) 版本。目前没有其他语言字典。
8、IdentifiersShouldDifferByMoreThanCase CA1708
标识符不应仅以大小写进行区分,不能仅通过大小写区分命名空间、类型、成员和参数的标识符,因为针对公共语言运行时的语言不需要区分大小写。
9、IdentifiersShouldHaveCorrectPrefix CA1715
标识符应具有正确的前缀,按照约定,某些编程元素的名称以特定前缀开头。
接口名称应以大写字母“I”开头,后跟另一个大写字母。泛型类型参数名称应以大写字母“T”开头,后面可跟另一个大写字母。
10、IdentifiersShouldHaveCorrectSuffix CA1715
基类型/接口 |
后缀 |
System.Attribute |
特性 |
System.EventArgs |
EventArgs |
System.Exception |
异常 |
System.Collections.ICollection |
Collection |
System.Collections.IDictionary |
Dictionary |
System.Collections.IEnumerable |
Collection |
System.Collections.Queue |
Collection 或 Queue |
System.Collections.Stack |
Collection 或 Stack |
System.Collections.Generic.ICollection<T> |
Collection |
System.Collections.Generic.IDictionary<TKey, TValue> |
Dictionary |
System.Data.DataSet |
数据集 |
System.Data.DataTable |
Collection 或 DataTable |
System.IO.Stream |
流 |
System.Security.IPermission |
权限 |
System.Security.Policy.IMembershipCondition |
Condition |
事件处理程序委托。 |
EventHandler |
11、IdentifiersShouldNotContainTypeNames CA1720
12、IdentifiersShouldNotContainUnderscores CA1707
13、IdentifiersShouldNotHaveIncorrectPrefix CA1722
14、IdentifiersShouldNotHaveIncorrectSuffix CA1711
15、IdentifiersShouldNotMatchKeywords CA1716
16、OnlyFlagsEnumsShouldHavePluralNames CA1717
17、ParameterNamesShouldMatchBaseDeclaration CA1725
18、ParameterNamesShouldNotMatchMemberNames CA1719
19、PropertyNamesShouldNotMatchGetMethods CA1721
20、ResourceStringCompoundWordsShouldBeCasedCorrectly CA1701
21、ResourceStringsShouldBeSpelledCorrectly CA1703
22、TypeNamesShouldNotMatchNamespaces CA1724
使用首选词条,此规则将标识符分析为标记。将对照规则中内置的词条(位于任何自定义字典的“已否决”部分)比较每个单一标记和每个连续的双标记组合。下表演示该规则中内置的词条以及它们的首选备用词条。
过时的词条 |
首选词条 |
Arent |
AreNot |
Cancelled |
Canceled |
Cant |
Cannot |
ComPlus |
EnterpriseServices |
Couldnt |
CouldNot |
Didnt |
DidNot |
Doesnt |
DoesNot |
Dont |
DoNot |
Flag 或 Flags |
无替代词条。不使用。 |
Hadnt |
HadNot |
Hasn’t |
HasNot |
Havent |
HaveNot |
Indices |
Indexes |
Isnt |
IsNot |
LogIn |
LogOn |
LogOut |
LogOff |
Shouldnt |
ShouldNot |
SignOn |
SignIn |
SignOff |
SignOut |
Wasnt |
WasNot |
Werent |
WereNot |
Wont |
WillNot |
Wouldnt |
WouldNot |
Writeable |
Writable |
六、Performancerules(性能规则)
2、AvoidUncalledPrivateCode CA1811
3、AvoidUninstantiatedInternalClasses CA1812
4、AvoidUnsealedAttributes CA1813
5、DoNotCastUnnecessarily CA1800
避免进行不必要的强制转换,重复强制转换会降低性能,特别是在精简的迭代语句中执行强制转换时。对于显式重复强制转换操作,将强制转换的结果存储在局部变量中,并使用局部变量来替代重复强制转换操作。
6、InitializeReferenceTypeStaticFieldsInline CA1810
8、OverrideEqualsAndOperatorEqualsOnValueTypes CA1815
9、PreferJaggedArraysOverMultidimensional CA1814
与多维数组相比,首选使用交错的数组,交错数组是元素为数组的数组。构成元素的数组可以是不同的大小,以减少某些数据集的浪费空间。
10、 PropertiesShouldNotReturnArrays CA1819
属性不应返回数组,即使属性是只读的,该属性返回的数组也不是写保护的。若要使数组不会被更改,属性必须返回数组的副本
11、 RemoveEmptyFinalizers CA1821
13、TestForEmptyStringsUsingStringLength CA1820
八、Securityrule(安全性规则)
1、CallGCKeepAliveWhenUsingNativeResources CA2115
处理 Exception 的 catch 块会捕获所有符合公共语言规范 (CLS) 的异常。但是,它不捕获不符合 CLS 的异常。
try{ThrowsExceptions.ThrowNonClsException();}
catch(Exception e) {// Remove some permission.
Console.WriteLine("CLS compliant exception caught"); }
2、DoNotDeclareReadOnlyMutableReferenceTypes CA2104
不要声明只读可变引用类型,举例:static protected readonly StringBuilder SomeStringBuilder;
FxCop的安装文件,规则的翻译,建议采纳项目列表,以及"采纳项目列表"的*.FxCop文件可以从我的资源中下载:FxCop整套资料下载
代码审查工具FxCop建议采用的规则总结相关推荐
- [置顶] 代码审查工具FxCop建议采用的规则总结
续接: 代码走查工具篇FxCop的规则总结与翻译_Part1 代码走查工具篇FxCop的规则总结与翻译_Part2 代码走查工具篇FxCop的规则总结与翻译_Part3 本篇结合我的实际工作需要,总结 ...
- 代码审查工具 sonarqube 简介
目录 1. 什么是SonarQube? SonarQube的功能 1.糟糕的复杂度分布 2.重复 3.缺乏单元测试 4.没有代码标准 5.没有足够的或者过多的注释 6.潜在的bug 7.糟糕的设计(原 ...
- 代码审查工具StyleCop
"代码审查"或是"代码评审"(Code Review),这是一个流程,当开发人员写好代码后,需要让别人来review一下他的代码,这是一种有效发现BUG的方法. ...
- 20最佳代码审查工具-专门为开发人员准备
程序员总是面临最后期限的压力和很多延误软件设计相当不稳定,整个产品是不稳定的.这种不稳定性的设计软件的原因是,它是不能正常测试.来的工作代码审查工具.的代码审查工具可以帮助web开发人员指出他们哪些区 ...
- 盘点2020年最好用的6大智能建站工具,建议收藏
下文为大家盘点2020年6款最好用的智能建站工具,建议收藏! NO.1 WordPress 网址:https://cn.wordpress.org/ WordPress是一款高效建站工具,它号称5分钟 ...
- Upsource 一个新的代码审查工具-安装使用指南
为什么80%的码农都做不了架构师?>>> Upsource 一个新的代码审查工具(Polyglot code review tool),Upsource安装.配置及使用介绍-- ...
- [每日一问]虚拟化网络设计中为什么建议采用链路聚合
虚拟化网络设计中为什么建议采用链路聚合?原因如下: 1. 首先,链路聚合技术可以使用多个物理链路进行通信,不用担心STP: 2. 其次,当某物理链路发生故障会不影响虚拟机网络的正常运行,提供了链路冗余 ...
- 百度工具问题以下对URL规则的阐述,哪些是错误的
[百度工具问题]以下对URL规则的阐述,哪些是错误的 百度工具问题以下对URL规则的阐述,哪些是错误的 标签:内容视线紧盯同一张面孔.那离开学院一年多地师弟(师兄);死亡魔方.轻语团的人也都停在原来的 ...
- java json 下划线_为什么rest接口返回json建议采用下划线形式,不要用驼峰
今天被数据大神说了,对接第三方接口返回的json字段我想用驼峰形式,他说我这样不专业.所以就改了,认怂. 记住以后再次对接rest接口,返回的字段用下划线形式 记录一下改的内容 1.使用fastjso ...
- 代码审查工具【Review Board】在Windows环境下安装与配置
前言 Review Board是基于Web的代码审查工具. 官方网站:https://www.reviewboard.org/ Review Board在Windows环境下安装是一件比较困难的事情, ...
最新文章
- java反编器中文版,java反编译软件下载
- 51Nod 斜率最大
- java系统界面找不到符号,找不到符号,java找不到符号
- echat 图表动态数据生成,渲染,自定义Y轴坐标值
- linux java 安装 gi_gi的安装和使用
- 1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】
- 纽约州立大学宾汉姆顿大学计算机科学,C同学喜获纽约州立大学宾汉姆顿大学硕士录取...
- QQ网页登陆密码加密方式(农场、空间、WebQQ等通用)
- java 舍_Java中BigDecimal的8种舍入模式
- (篇八)C语言在母串删子串、输入位置截取子串
- kali linux 模板文件夹,详解kali linux 常用文件与指令路径
- laydate 和 Vue 奇怪的清空问题
- [ioi2008]Island 岛屿
- VS 母版使用配置技巧
- PHP获取对象的hashcode_php 字符串转hashcode(包括中文)
- matlab双目标定
- mysql 唯一性榆树_榆树有多少种
- 计算机软件系统 七年级,系统软件作用大七年级信息技术教案(5页)-原创力文档...
- WordPress增加网站地图
- python剔除数字 青少年编程电子学会python编程等级考试二级真题解析2020年12月