续接上篇:代码走查工具篇FxCop的规则总结与翻译_Part2
1、AvoidExcessiveLocals CA1809
避免过多的局部变量,优化性能的常见方法是将值存储于处理器寄存器,而不是内存中,这称为“注册值”。公共语言运行时最多可考虑注册 64 个局部变量。未注册的变量放在堆栈中,必须移到寄存器内方能进行操作。若要提供所有的局部变量都能注册的机会,应将局部变量的数目限制在 64 个以内。
2、AvoidUncalledPrivateCode CA1811
避免使用未调用的私有代码。
3、AvoidUninstantiatedInternalClasses CA1812
避免未实例化的内部类
4、AvoidUnsealedAttributes CA1813
避免使用未密封的特性
5、DoNotCastUnnecessarily CA1800
避免进行不必要的强制转换,重复强制转换会降低性能,特别是在精简的迭代语句中执行强制转换时。对于显式重复强制转换操作,将强制转换的结果存储在局部变量中,并使用局部变量来替代重复强制转换操作。
6、InitializeReferenceTypeStaticFieldsInline CA1810
以内联方式初始化引用类型的静态字段,当一个类型声明显式静态构造函数时,实时 (JIT) 编译器会向该类型的每个静态方法和实例构造函数中添加一项检查,以确保之前已调用该静态构造函数。访问任何静态成员或创建了类型实例时,都会触发静态初始化。示例用法:
public class NoStaticConstructor { static int someInteger = 3; static string resourceString = InitializeResourceString(); static string InitializeResourceString() { ResourceManager stringManager = new ResourceManager("strings", Assembly.GetExecutingAssembly()); return stringManager.GetString("string"); } }
7、MarkAssembliesWithNeutralResourcesLanguage CA1824
用 NeutralResourcesLanguageAttribute 标记程序集。
8、MarkMembersAsStatic CA1822
将成员标记为 static,可以将不访问实例数据或不调用实例方法的成员标记为 static(在 Visual Basic 中为 Shared)。在将这些方法标记为 static 之后,编译器将向这些成员发出非虚拟调用站点。发出非虚拟调用站点将禁止在运行时对每个调用进行检查,从而确保当前的对象指针为非空。这会使性能敏感的代码的性能得到显著提高。在某些情况下,如果无法访问当前的对象实例,则表示存在正确性问题。
9、OverrideEqualsAndOperatorEqualsOnValueTypes CA1815
重写值类型上的 Equals 和相等运算符。对于值类型,Equals 的继承的实现使用反射库,并比较所有字段的内容。反射需要消耗大量计算资源,可能没有必要比较每一个字段是否相等。如果希望用户对实例进行比较或排序,或者希望用户将其作为哈希表键,则值类型必须实现 Equals。如果编程语言支持运算符重载,则还应提供等号和不等号运算符的实现。
10、PreferJaggedArraysOverMultidimensional CA1814
与多维数组相比,首选使用交错的数组,交错数组是元素为数组的数组。构成元素的数组可以是不同的大小,以减少某些数据集的浪费空间。
11、 PropertiesShouldNotReturnArrays CA1819
属性不应返回数组,即使属性是只读的,该属性返回的数组也不是写保护的。若要使数组不会被更改,属性必须返回数组的副本
12、 RemoveEmptyFinalizers CA1821
应尽可能避免析构函数,因为跟踪对象生存期会产生额外的性能系统开销。垃圾收集器将在收集该对象之前运行析构函数。这意味着收集该对象需要两个集合。空的终结器只会徒增这种系统开销,而没有一点好处。如果进行调试时需要一个终结器,请将整个终结器括在 #if DEBUG / #endif 指令中。
13、RemoveUnusedLocals CA1804
移除未使用的局部变量
14、TestForEmptyStringsUsingStringLength CA1820
使用字符串长度测试是否有空字符串,使用 String.Length 属性或 String.IsNullOrEmpty 方法比较字符串要比使用 Equals 的速度快得多。这是因为与 IsNullOrEmpty 或者为检索 Length 属性值并将其与零比较所需执行的指令数相比,Equals 执行更多的 MSIL 指令。
15、UseLiteralsWhereAppropriate CA1802
在合适的位置使用文本,在调用声明类型的静态构造函数时,会在运行时计算 staticreadonly 字段的值。如果在声明 staticreadonly 字段时未对其进行初始化,而且未显式声明静态构造函数,则编译器会发出一个静态构造函数来初始化该字段。const 字段的值在编译时计算并将存储在元数据库中,与 staticreadonly 字段相比,这有助于提高运行时性能。因为赋给目标字段的值可在编译时计算,所以,请将声明更改为 const 字段,以便该值在编译时(而非运行时)计算。
1、PInvokeDeclarationsShouldBePortable CA1901
P/Invoke 声明应为可移植声明,可通过使用 IntPtr 或 UIntPtr(而非 Int32 或 UInt32)表示句柄来修复此冲突。
2、UseOnlyApiFromTargetedFramework CA1903
仅使用目标框架中的 API。
3、ValueTypeFieldsShouldBePortable CA1900
值类型字段应为可移植字段,当用显式布局声明的结构封送到 64 位操作系统上的非托管代码时,是否正确对齐。IA-64 不允许访问未对齐的内存,如果此冲突未得到修复,进程将崩溃。
1、AptcaMethodsShouldOnlyCallAptcaMethods CA2116
APTCA 方法应只调用 APTCA 方法
2、AptcaTypesShouldOnlyExtendAptcaBaseTypes CA2117
APTCA 类型应只扩展 APTCA 基类型
3、ArrayFieldsShouldNotBeReadOnly CA2105
数组字段不应为只读,设置了也不启作用。
4、CallGCKeepAliveWhenUsingNativeResources CA2115
处理 Exception 的 catch 块会捕获所有符合公共语言规范 (CLS) 的异常。但是,它不捕获不符合 CLS 的异常。
try{ThrowsExceptions.ThrowNonClsException();}
catch(Exception e) {// Remove some permission.
Console.WriteLine("CLS compliant exception caught"); }
catch{// Remove the same permission as above. Console.WriteLine("Non-CLS compliant exception caught."); }
5、DoNotDeclareReadOnlyMutableReferenceTypes CA2104
不要声明只读可变引用类型,举例:static protected readonly StringBuilder SomeStringBuilder;
6、DoNotIndirectlyExposeMethodsWithLinkDemands CA2122
不要使用链接请求间接公开方法,
7、MethodSecurityShouldBeASupersetOfType CA2114
方法安全性应是类型安全性的超集,
8、安全性规则后续规则虑过,因为个人愚见,自己团队暂时用不到。
1、DefaultConstructorsMustHaveConsistentTransparencyFxCopRule CA2132
默认构造函数必须至少与基类型默认构造函数具有同样的关键性,具有 SecurityCriticalAttribute 的类型和成员无法供 Silverlight 应用程序代码使用。安全关键类型和成员只能供 .NET Framework for Silverlight 类库中的受信任代码使用。
2、DelegatesMustBindWithConsistentTransparencyFxCopRule CA2133
委托类型及其绑定的方法必须有一致的透明度。透明和安全关键委托可能仅绑定到其他透明或关键安全方法。相似地,关键委托可能仅将绑定到关键的方法。这些绑定规则确保通过委托调用方法的唯一代码也已直接调用相同方法。例如,绑定规则阻止透明代码直接通过透明委托调用关键代码。
3、省略若干项安全透明性规则,因为个人愚见,自己团队暂时用不到。
1、暂不翻译次分类下的规则,下一篇总结能在自己实际工作中用到的项目。