“Microsoft 基本更正规则”代码分析规则集

“Microsoft 基本更正规则”规则集侧重于使用 framework API 时的逻辑错误和常见错误。 “基本更正规则”包括“Microsoft 最少量建议规则”规则集中的规则。 有关更多信息,请参见 “Microsoft 最少量建议规则”代码分析规则集。应加入此规则集以扩展最少量建议规则所报告的警告列表。

下表介绍了“Microsoft 基本更正规则”规则集中的所有规则。

规则

说明

CA1008:枚举应具有零值

像其他值类型一样,未初始化枚举的默认值为零。 无标志特性的枚举应定义零值的成员,这样默认值即为该枚举的有效值。 如果应用了 FlagsAttribute 特性的枚举定义值为零成员,则该成员的名称应为“None”,以指示枚举中尚未设置值。

CA1013:重载加法方法和减法方法时重载相等运算符

公共或受保护类型实现加或减运算符时没有实现相等运算符。

CA1303:不要将文本作为本地化参数传递

某外部可见的方法将一个字符串作为参数传递给 .NET Framework 类库中的构造函数或方法,该字符串应该是可本地化的。

CA1308:将字符串规范化为大写

字符串应正常化为大写字母。 有少量字符转换为小写字母后不能再转换回来。

CA1806:不要忽略方法结果

创建一个新对象,但从不使用该对象;或者调用会创建并返回一个新字符串的方法,但从不使用这个新字符串;或者 COM 或 P/Invoke 方法返回一个从不使用的 HRESULT 或错误代码。

CA1816:正确调用 GC.SuppressFinalize

作为 Dispose 的实现的某个方法未调用 GC.SuppressFinalize,或者不是 Dispose 的实现的某个方法调用了 GC.SuppressFinalize,或者某个方法调用了 GC.SuppressFinalize 并传递 this(在 Visual Basic 中是 Me)以外的某个值。

CA1819:属性不应返回数组

即使属性是只读的,该属性返回的数组也不是写保护的。 若要使数组不会被更改,属性必须返回数组的副本。 通常,用户不能理解调用这种属性的负面性能影响。

CA1820:使用字符串长度测试是否有空字符串

使用 String.Length 属性或 String.IsNullOrEmpty 方法比较字符串要比使用 Equals 的速度快得多。

CA1903:仅使用目标框架中的 API

成员或类型将使用 Service Pack 中引入的成员或类型,项目目标框架中未及包括它们。

CA2004:移除对 GC.KeepAlive 的调用

如果转换为使用 SafeHandle,请移除所有对 GC.KeepAlive (object) 的调用。 在这种情况下,类不必调用 GC.KeepAlive,因为假定它们没有终结器,只是依赖 SafeHandle 来为它们完成 OS 句柄。

CA2006:使用 SafeHandle 封装本机资源

在托管代码中使用 IntPtr 可能意味着潜在的安全性和可靠性方面的问题。 必须检查所有使用 IntPtr 之处,以确定是否需要在该处使用 SafeHandle 或类似的技术。

CA2102:在常规处理程序中捕捉非 CLSCompliant 异常

程序集中未标以 RuntimeCompatibilityAttribute 或标以 RuntimeCompatibility(WrapNonExceptionThrows = false) 的某个成员包含一个处理 System.Exception 的 catch 块,而不包含紧跟其后的一般 catch 块。

CA2104:不要声明只读可变引用类型

外部可见类型包含外部可见的只读字段,该字段为可变的引用类型。 可变类型是实例数据可被修改的类型。

CA2105:数组字段不应为只读

向包含数组的字段应用 readonly(在 Visual Basic 中为 ReadOnly)修饰符时,无法将该字段更改为引用其他数组。 但是,可以更改在只读字段中存储的数组的元素。

CA2106:保护断言

某个方法断言权限,但不对调用方执行任何安全检查。 如果在不执行任何安全检查的情况下断言安全权限,则会在代码中留下可利用的安全漏洞。

CA2115:使用本机资源时调用 GC.KeepAlive

该规则检测由于在非托管代码仍在使用非托管资源时终止该非托管资源而可能发生的错误。

CA2119:密封满足私有接口的方法

可继承的公共类型为内部(在 Visual Basic 中为 Friend)接口提供可重写的方法实现。 若要修复与此规则的冲突,请禁止方法在程序集外重写。

CA2120:保护序列化构造函数

此类型的构造函数采用了 System.Runtime.Serialization.SerializationInfo 对象和 System.Runtime.Serialization.StreamingContext 对象(序列化构造函数的签名)。 此构造函数不受安全检查的保护,但类型中的一个或多个常规构造函数受保护。

CA2121:静态构造函数应为私有

系统在创建第一个类型实例或引用任何静态成员之前调用静态构造函数。 如果静态构造函数不是私有,则系统以外的代码可以调用它。 根据构造函数中执行的操作,这可能导致意外行为。

CA2205:使用 Win32 API 的托管等效项

定义了平台调用方法,但在 .NET Framework 类库中存在具有等效功能的方法。

CA2215:Dispose 方法应调用基类的 Dispose

如果类型继承自可释放类型,则必须从它自己的 Dispose 方法中调用基类型的 Dispose 方法。

CA2221:终结器应受到保护

终结器必须使用族访问修饰符。

CA2222:不要递减继承成员的可见性

不能更改所继承成员的访问修饰符。 将继承的成员更改为私有成员不能防止调用方访问该方法的基类实现。

CA2223:成员不应只是返回类型不同

虽然公共语言运行时允许使用返回类型区分其余部分都相同的成员,但该功能不包含在公共语言规范中,也不是各种 .NET 编程语言的共同功能。

CA2224:重载相等运算符时重写 Equals 方法

某公共类型实现了等号运算符,但是没有重写 Object.Equals。

CA2226:运算符应有对称重载

某个类型实现了相等运算符或不等运算符,却未实现相反运算符。

CA2227:集合属性应为只读

使用可写的集合属性,用户可以将该集合替换为不同的集合。 只读属性禁止替换该集合,但仍允许设置单个成员。

CA2231:重写 ValueType.Equals 时应重载相等运算符

值类型重写 Object.Equals,但未实现相等运算符。

CA2239:为可选字段提供反序列化方法

类型有一个使用 System.Runtime.Serialization.OptionalFieldAttribute 特性标记的字段,并且该类型没有提供反序列化事件处理方法。