托管代码的代码分析警告(按 CheckId 排列)
下表列出了托管代码的代码分析警告,按警告的 CheckId 标识符排列。
警告
CheckId |
警告 |
说明 |
---|---|---|
CA1000 |
调用泛型类型的静态成员时,必须指定该类型的类型参数。 当调用不支持推理的泛型实例成员时,必须指定该成员的类型参数。 在上述两种情况下,用于指定类型参数的语法不同,但很容易混淆。 |
|
CA1001 |
一个类声明并实现 System.IDisposable 类型的实例字段,但该类不实现 IDisposable。 声明 IDisposable 字段的类间接拥有非托管资源,并且应该实现 IDisposable 接口。 |
|
CA1002 |
System.Collections.Generic.List<(Of <(T>)>) 是针对性能(而非继承)设计的泛型集合。 因此,List 不包含任何虚拟成员。 应改为公开针对继承设计的泛型集合。 |
|
CA1003 |
某个类型包含的委托返回 void,该委托的签名包含两个参数(第一个参数是对象,第二个参数是可以分配给 EventArgs 的类型),而且包含程序集针对的是 Microsoft .NET Framework 2.0。 |
|
CA1004 |
推理是指由传递给泛型方法的参数的类型来确定该方法的类型参数,而不是显式指定类型参数。 若要启用推理,泛型方法的参数签名必须包含与该方法的类型参数属于相同类型的参数。 在这种情况下,不必指定类型参数。 如果对所有类型参数都使用推理,则调用泛型实例方法和非泛型实例方法的语法完全相同;这简化了泛型方法的可用性。 |
|
CA1005 |
泛型类型包含的类型参数越多,越难以知道并记住每个类型参数各代表什么。 它通常有一个类型参数,如 List<T> 中,而在某些情况下有两个类型参数,如 Dictionary<TKey, TValue> 中。 但是,如果存在两个以上的类型参数,则大多数用户都会感到过于困难。 |
|
CA1006 |
嵌套类型参数是一个类型参数,也是一个泛型类型。 若要调用签名包含嵌套类型参数的成员,用户必须实例化一个泛型类型,并将此类型传递到另一个泛型类型的构造函数。 所需的过程和语法很复杂,应当避免。 |
|
CA1007 |
外部可见方法包含类型为 System.Object 的引用参数。 使用泛型方法使受约束的所有类型都可以传递给该方法,而比不先将类型强制转换为引用参数类型。 |
|
CA1008 |
像其他值类型一样,未初始化枚举的默认值为零。 无标志特性的枚举应通过使用零值来定义成员,这样默认值即为该枚举的有效值。 如果应用了 FlagsAttribute 特性的枚举定义值为零成员,则该成员的名称应为“None”,以指示枚举中尚未设置值。 |
|
CA1009 |
事件处理程序方法采用两个参数。 第一个参数属于 System.Object 类型,名为“sender”。 它是引发事件的对象。 第二个参数属于 System.EventArgs 类型,名为“e”。 这是与该事件关联的数据。 事件处理程序方法不应返回值;在 C# 编程语言中,这由返回类型 void 指示。 |
|
CA1010 |
若要扩大集合的用途,应实现某个泛型集合接口。 然后,可以使用该集合来填充泛型集合类型。 |
|
CA1011 |
在方法声明中将基类型指定为参数时,可以将派生自基类型的任何类型作为相应的参数传递给方法。 如果不需要派生参数类型提供的其他功能,则使用基类型将使方法可以得到更广泛的使用。 |
|
CA1012 |
抽象类型的构造函数只能由派生类型调用。 由于公共构造函数用于创建类型的实例,但无法为抽象类型创建实例,因此具有公共构造函数的抽象类在设计上是错误的。 |
|
CA1013 |
公共或受保护类型实现加或减运算符时没有实现相等运算符。 |
|
CA1014 |
公共语言规范 (CLS) 定义了程序集在跨编程语言使用时必须符合的命名限制、数据类型和规则。 好的设计要求所有程序集用 CLSCompliantAttribute 显式指示 CLS 合规性。 如果程序集没有此特性,则该程序集即不合规。 |
|
CA1016 |
.NET Framework 使用版本号唯一地标识程序集,并绑定到具有强名称的程序集中的类型。 版本号与版本和发行者策略一起使用。 默认情况下,仅使用用于生成应用程序的程序集版本运行应用程序。 |
|
CA1017 |
ComVisibleAttribute 决定 COM 客户端如何访问托管代码。 合理的设计指出程序集将显式指示 COM 可见性。 可以设置整个程序集的 COM 可见性,然后重写各个类型和类型成员的 COM 可见性。 如果此特性不存在,则程序集的内容对 COM 客户端可见。 |
|
CA1018 |
当定义自定义特性时,用 AttributeUsageAttribute 标记该特性,以指示源代码中可以应用自定义特性的位置。 特性的含义和预定用法将决定它在代码中的有效位置。 |
|
CA1019 |
特性可以定义强制实参,在对目标应用该特性时必须指定这些实参。 这些实参也称为位置实参,因为它们将作为位置形参提供给特性构造函数。 对于每一个强制变量,特性还必须提供一个相应的只读属性,以便可以在执行时检索该变量的值。 特性还可以定义可选实参,可选实参也称为命名实参。 这些变量按名称提供给特性构造函数,并且必须具有相应的读/写属性。 |
|
CA1020 |
请确保每个命名空间都有一个逻辑组织,并确保将类型放入稀疏填充的命名空间的理由是有效的。 |
|
CA1021 |
通过引用(使用 out 或 ref)传递类型要求具有使用指针的经验,了解值类型和引用类型的不同之处,以及能处理具有多个返回值的方法。 另外,out 和 ref 参数之间的差异没有得到广泛了解。 |
|
CA1023 |
索引器(即索引属性)应该使用一个索引。 多维索引器会大大降低库的可用性。 |
|
CA1024 |
公共或受保护方法的名称以“Get”开头,没有采用任何参数或返回的值不是数组。 该方法可能很适于成为属性。 |
|
CA1025 |
如果参数的具体数量未知且变量参数为相同类型或可作为相同类型传递,请使用参数数组代替重复参数。 |
|
CA1026 |
CLS 中允许使用默认参数的方法;但是 CLS 允许编译器忽略为这些参数分配的值。 为了跨编程语言维护所需的行为,必须使用提供默认参数的方法重载来替换使用默认参数的方法。 |
|
CA1027 |
枚举是一种值类型,它定义一组相关的已命名常数。 如果可以按照有意义的方式组合一个枚举的已命名常数,则对该枚举应用 FlagsAttribute。 |
|
CA1028 |
枚举是一种值类型,它定义一组相关的已命名常数。 默认情况下,System.Int32 数据类型用于存储常量值。 尽管您可以更改此基础类型,然而对于大多数情况,既不需要,也不建议您这样做。 |
|
CA1030 |
该规则检测名称通常用于事件的方法。 如果为响应明确定义的状态更改而调用一个方法,则应由事件处理程序调用该方法。 调用该方法的对象应引发事件而不是直接调用该方法。 |
|
CA1031 |
不应捕捉一般异常。 捕捉更具体的异常,或者在执行 catch 块中的最后一条语句时重新引发一般异常。 |
|
CA1032 |
如果不能提供完整的构造函数集,要正确处理异常将变得比较困难。 |
|
CA1033 |
未密封的外部可见类型提供了显式实现公共接口的方法,但没有提供具有相同名称的其他外部可见方法。 |
|
CA1034 |
嵌套类型是在另一个类型的范围中声明的类型。 嵌套类型用于封装包含类型的私有实现详细信息。 如果用于此用途,则嵌套类型不应是外部可见的。 |
|
CA1035 |
此规则要求 ICollection 实现提供强类型成员,以使用户在使用该接口提供的功能时不必将参数强制转换成 Object 类型。 此规则假定实现 ICollection 的类型这样做是为了管理其类型强于对象的实例的集合。 |
|
CA1036 |
公共或受保护类型实现 System.IComparable 接口。 它不重写 Object.Equals,也不重载表示相等、不等、小于或大于的语言特定运算符。 |
|
CA1038 |
此规则要求 IEnumerator 实现还提供 Current 属性的强类型版本,以使用户在使用该接口提供的功能时不必将返回值强制转换为强类型。 |
|
CA1039 |
此规则要求 IList 实现提供强类型成员,以使用户在使用该接口提供的功能时不必将参数强制转换成 System.Object 类型。 |
|
CA1040 |
接口定义提供某个行为或使用协定的成员。 接口所描述的功能可以被任何类型采用,而不管该类型出现在继承层次结构中的哪个位置。 类型通过实现接口的成员来实现接口。 空接口无法定义任何成员;因此,它无法定义可以实现的协定。 |
|
CA1041 |
用未指定其 ObsoleteAttribute.Message 属性的 System.ObsoleteAttribute 特性来标记类型或成员。 当编译用 ObsoleteAttribute 标记的类型或成员时,将显示该特性的 Message 属性。 这将为用户提供有关已过时的类型或成员的信息。 |
|
CA1043 |
索引器(即索引属性)应将整型或字符串类型用于索引。 这些类型一般用于为数据结构编制索引,并且提高库的可用性。 应仅限于在设计时无法指定特定整型或字符串类型的情况下使用 Object 类型。 |
|
CA1044 |
虽然可以接受且经常需要使用只读属性,但设计准则禁止使用只写属性。 这是因为允许用户设置值但又禁止该用户查看这个值不能提供任何安全性。 而且,如果没有读访问,将无法查看共享对象的状态,使其用处受到限制。 |
|
CA1045 |
通过引用(使用 out 或 ref)传递类型要求具有以下能力:使用指针的经验,了解值类型和引用类型的不同之处,以及能处理具有多个返回值的方法。 为一般用户进行设计的库架构师不应指望用户能熟练运用 out 或 ref 参数。 |
|
CA1046 |
对于引用类型,相等运算符的默认实现几乎始终是正确的。 默认情况下,仅当两个引用指向同一对象时,它们才相等。 |
|
CA1047 |
类型声明受保护的成员,使继承类型可以访问或重写该成员。 按照定义,不能继承密封类型,这表示不能调用密封类型上的受保护方法。 |
|
CA1048 |
类型将方法声明为虚方法,使继承类型可以重写虚方法的实现。 按照定义,不能继承密封类型。 这使得虚方法对于密封类型没有意义。 |
|
CA1049 |
分配非托管资源的类型应该实现 IDisposable,以使调用方可以根据需要释放这些资源,并缩短持有这些资源的对象的生存期。 |
|
CA1050 |
应在命名空间内声明类型以避免名称冲突,并作为一种在对象层次结构中组织相关类型的方式。 |
|
CA1051 |
字段的主要用途应是作为实现的详细信息。 字段应为 private 或 internal,并应通过使用属性公开这些字段。 |
|
CA1052 |
公共或受保护类型仅包含静态成员,而且没有用 sealed(C# 参考)(NotInheritable) 修饰符声明该类型。 应使用 sealed 修饰符标记不希望被继承的类型,以免将其用作基类型。 |
|
CA1053 |
公共或嵌套公共类型只声明了静态成员,但具有公共或受保护的默认构造函数。 由于调用静态成员不需要类型的示例,因此没必要使用构造函数。 为安全起见,字符串重载应使用字符串参数调用统一资源标识符 (URI) 重载。 |
|
CA1054 |
如果某方法采用 URI 的字符串表示形式,则应提供采用 URI 类的实例的相应重载,该重载以安全的方式提供这些服务。 |
|
CA1055 |
此规则假定该方法返回 URI。 URI 的字符串表示形式容易导致分析和编码错误,并且可造成安全漏洞。 System.Uri 类以一种安全的方式提供这些服务。 |
|
CA1056 |
此规则假定属性表示统一资源标识符 (URI)。 URI 的字符串表示形式容易导致分析和编码错误,并且可造成安全漏洞。 System.Uri 类以一种安全的方式提供这些服务。 |
|
CA1057 |
某个类型声明的方法重载与 System.Uri 参数仅在字符串参数的放置方面有所不同。 采用字符串参数的重载不调用采用 URI 参数的重载。 |
|
CA1058 |
外部可见的类型扩展某些基类型。 请使用某个备选项。 |
|
CA1059 |
具体类型是指具有一个完整实现因此可以实例化的类型。 若要使成员可以得到广泛使用,请使用建议的接口来替换具体类型。 |
|
CA1060 |
平台调用方法(例如标以 System.Runtime.InteropServices.DllImportAttribute 特性的那些方法,或在 Visual Basic 中使用 Declare 关键字定义的方法)可以访问非托管代码。 这些方法应属于 NativeMethods、SafeNativeMethods 或 UnsafeNativeMethods 类。 |
|
CA1061 |
如果派生方法的参数签名只是在类型方面有所不同,而且与基方法的参数签名中的对应类型相比,这些类型的派生方式更弱,则基类型中的方法由派生类型中的同名方法隐藏。 |
|
CA1062 |
对于传递给外部可见方法的所有引用参数,都应检查其是否为 null。 |
|
CA1063 |
所有的 IDisposable 类型都应当正确实现 Dispose 模式。 |
|
CA1064 |
内部异常仅在其自己的内部范围内可见。 当异常超出内部范围后,只能使用基异常来捕获该异常。 如果内部异常是从 T:System.Exception、T:System.SystemException 或 T:System.ApplicationException 继承而来,外部代码将没有足够的信息了解如何处理该异常。 |
|
CA1065 |
不应引发异常的方法引发了异常。 |
|
CA1300 |
为了让使用从右到左阅读顺序的文化区域正确显示消息框,必须将 MessageBoxOptions 枚举的 RightAlign 和 RtlReading 成员传递给 Show 方法。 |
|
CA1301 |
访问键也称为快捷键,它通过使用 Alt 键来实现对控件的键盘访问。 如果多个控件具有重复的访问键,则访问键的行为定义不正确。 |
|
CA1302 |
System.Environment.SpecialFolder 枚举包含表示特殊系统文件夹的成员。 对于不同的操作系统,这些文件夹的位置可能具有不同的值;用户也可能会更改某些位置;或者这些位置已经进行了本地化。 Environment.GetFolderPath 方法返回与 Environment.SpecialFolder 枚举关联、经过本地化且与当前正在运行的计算机相应的位置。 |
|
CA1303 |
某外部可见的方法将一个字符串作为参数传递给 .NET Framework 类库中的构造函数或方法,该字符串应该是可本地化的。 |
|
CA1304 |
某方法或构造函数调用的成员有一个接受 System.Globalization.CultureInfo 参数的重载,但该方法或构造函数没有调用接受 CultureInfo 参数的重载。 如果未提供 CultureInfo 或 System.IFormatProvider 对象,则重载成员提供的默认值可能不会在所有区域设置中产生您想要的效果。 |
|
CA1305 |
某方法或构造函数调用的一个或多个成员有接受 System.IFormatProvider 参数的重载,但该方法或构造函数没有调用接受 IFormatProvider 参数的重载。 如果未提供 System.Globalization.CultureInfo 或 IFormatProvider 对象,则重载成员提供的默认值可能不会在所有区域设置中产生您想要的效果。 |
|
CA1306 |
区域设置决定数据的区域性特定显示元素,例如,数值、货币符号和排序顺序所用的格式。 在创建 DataTable 或 DataSet 时,应显式设置区域设置。 |
|
CA1307 |
字符串比较运算使用不设置 StringComparison 参数的方法重载。 |
|
CA1308 |
字符串应正常化为大写字母。 少量字符转换为小写字母后不能再转换回来。 |
|
CA1309 |
非语义的字符串比较运算不会将 StringComparison 参数设置为 Ordinal 或 OrdinalIgnoreCase。 因此,通过将参数显式设置为 StringComparison.Ordinal 或 StringComparison.OrdinalIgnoreCase,通常可以提高代码的速度、正确性和可靠性。 |
|
CA1400 |
公共或受保护方法标有 System.Runtime.InteropServices.DllImportAttribute 特性。 未能找到非托管库,或者未能将方法与库中的函数匹配。 |
|
CA1401 |
公共类型中的公共或受保护方法具有 System.Runtime.InteropServices.DllImportAttribute 特性(还在 Visual Basic 中由 Declare 关键字实现)。 这些方法不能公开。 |
|
CA1402 |
在向 COM 客户端公开重载的方法时,只有第一个方法重载保留其名称。 对于后续重载,将为其指定唯一名称,方法是在其名称后面追加一个下划线字符 (_) 和一个与该重载的声明顺序对应的整数。 |
|
CA1403 |
某个 COM 可见的值类型用设置为 LayoutKind.Auto 的 System.Runtime.InteropServices.StructLayoutAttribute 特性标记。 这些类型的布局因 .NET Framework 的版本不同而不同,这将中断要求特定布局的 COM 客户端。 |
|
CA1404 |
调用了 Marshal.GetLastWin32Error 方法或等效的 Win32 GetLastError 函数,并且紧邻的前一个调用并非针对操作系统调用方法。 |
|
CA1405 |
某个 COM 可见的类型是从非 COM 可见的类型派生而来。 |
|
CA1406 |
Visual Basic 6 COM 客户端不能访问 64 位整数。 |
|
CA1407 |
COM 不支持静态方法。 |
|
CA1408 |
使用双重接口的类型使客户端可以绑定到特定的接口布局。 如果在将来的版本中对该类型或任何基类型的布局进行更改,将中断绑定到该接口的 COM 客户端。 默认情况下,如果未指定 ClassInterfaceAttribute 特性,则使用仅支持调度的接口。 |
|
CA1409 |
专门标记为对 COM 可见的某个引用类型包含公共的参数化构造函数,但不包含公共的默认(无参数)构造函数。 没有公共默认构造函数的类型不能由 COM 客户端创建。 |
|
CA1410 |
某个类型声明了用 System.Runtime.InteropServices.ComRegisterFunctionAttribute 特性标记的方法,但没有声明用 System.Runtime.InteropServices.ComUnregisterFunctionAttribute 特性标记的方法,或相反。 |
|
CA1411 |
用 System.Runtime.InteropServices.ComRegisterFunctionAttribute 特性或 System.Runtime.InteropServices.ComUnregisterFunctionAttribute 特性标记的方法在外部可见。 |
|
CA1412 |
某个类型用 System.Runtime.InteropServices.ComSourceInterfacesAttribute 特性标记,并且至少一个指定的接口未用设置为 ComInterfaceType.InterfaceIsIDispatch 的 System.Runtime.InteropServices.InterfaceTypeAttribute 特性标记。 |
|
CA1413 |
对 COM 可见的值类型的非公共实例字段对 COM 客户端可见。 请检查各个字段的内容以查找不应当公开的信息或将对设计或安全性造成意外影响的信息。 |
|
CA1414 |
Boolean 数据类型在非托管代码中有多种表示形式。 |
|
CA1415 |
此规则查找针对 Win32 函数的操作系统调用方法声明,这些函数具有指向 OVERLAPPED 结构参数的指针,而对应的托管参数不是指向 System.Threading.NativeOverlapped 结构的指针。 |
|
CA1500 |
实例方法声明一个名称与声明类型的实例字段匹配的参数或局部变量,从而导致错误。 |
|
CA1501 |
类型在继承层次结构中的深度超过四级。 深度嵌套的类型层次结构可能很难遵循、理解和维护。 |
|
CA1502 |
此规则通过方法来测量线性独立的路径的数量,该数量是由条件分支的数量和复杂度决定的。 |
|
CA1504 |
实例字段的名称以“s_”开头,或者 static(在 Visual Basic 中为 Shared)字段的名称以“m_”开头。 |
|
CA1505 |
类型或方法具有较低的可维护性索引值。 如果可维护性指数较低,则表示类型或方法可能难以维护,最好重新进行设计。 |
|
CA1506 |
此规则通过计算类型或方法包含的唯一类型引用的个数来衡量类耦合。 |
|
CA1600 |
不要将进程优先级设置为 Idle。 具有 System.Diagnostics.ProcessPriorityClass.Idle 优先级的进程将在 CPU 本应处于空闲状态时占用它,从而阻止进入待机状态。 |
|
CA1601 |
频率较高的定期活动会使 CPU 处于繁忙状态,并且会干扰具有节能功能(关闭显示器和硬盘)的空闲计时器。 |
|
CA1700 |
此规则假定当前不使用名称中包含“reserved”的枚举成员,而是将其作为一个占位符,以在将来的版本中重命名或移除它。 重命名或移除成员是一项重大更改。 |
|
CA1701 |
资源字符串中的每个单词根据大小写被拆分为标记。 Microsoft 拼写检查器库会对由两个连续的标记构成的每个组合进行检查。 如果被识别,该单词将生成规则冲突。 |
|
CA1702 |
标识符的名称包含多个单词,其中至少有一个单词似乎是大小写不正确的组合词。 |
|
CA1703 |
资源字符串包含一个或多个未被 Microsoft 拼写检查器库识别的单词。 |
|
CA1704 |
外部可见标识符的名称中包含一个或多个未被 Microsoft 拼写检查器库识别的单词。 |
|
CA1707 |
按照约定,标识符名称不包含下划线 (_) 字符。 该规则将检查命名空间、类型、成员和参数。 |
|
CA1708 |
不能仅通过大小写区分命名空间、类型、成员和参数的标识符,因为针对公共语言运行时的语言不需要区分大小写。 |
|
CA1709 |
按照约定,参数名使用 Camel 大小写,命名空间、类型和成员名称使用 Pascal 大小写。 |
|
CA1710 |
按照约定,扩展某些基类型或实现某些接口的类型的名称,或者由这些类型派生的类型的名称应具有与相应基类型或接口关联的后缀。 |
|
CA1711 |
按照约定,只有扩展某些基类型或实现某些接口的类型的名称或者从这些类型派生的类型的名称,应该以特定的保留后缀结尾。 其他类型名称不应使用这些保留的后缀。 |
|
CA1712 |
枚举成员的名称不能使用类型名称作为前缀,因为类型信息将由开发工具提供。 |
|
CA1713 |
事件的名称以“Before”或“After”开头。 若要命名按特定顺序引发的相关事件,请使用现在时或过去时指示一系列操作中的相对位置。 |
|
CA1714 |
公共枚举具有 System.FlagsAttribute 特性并且其名称不是以“s”结尾。 用 FlagsAttribute 标记的类型具有复数形式的名称,因为该特性指明可以指定多个值。 |
|
CA1715 |
外部可见的接口的名称不以大写的“I”开头。 外部可见的类型或方法上的泛型类型参数的名称不以大写的“T”开头。 |
|
CA1716 |
某个命名空间名称或类型名称与编程语言中的保留关键字相同。 命名空间和类型的标识符不应与针对公共语言运行时的语言所定义的关键字冲突。 |
|
CA1717 |
命名约定规定,复数形式的枚举名称表示可以同时指定多个枚举值。 |
|
CA1719 |
参数名称应传达参数的含义,成员名称应传达成员的含义。 两者相同的设计非常少见。 使参数与其成员同名会导致不直观的效果,会使库难以使用。 |
|
CA1720 |
外部可见成员中的某个参数的名称包含一个数据类型名称,或者外部可见成员的名称包含一个语言特定的数据类型名称。 |
|
CA1721 |
公共或受保护成员的名称以“Get”开头,且其余部分与公共或受保护属性的名称匹配。" “Get”方法和属性的名称应当能够明确表示其功能。 |
|
CA1722 |
按照约定,只有某些编程元素具有以特定前缀开头的名称。 |
|
CA1724 |
类型名称不应该与 .NET Framework 类库中定义的命名空间的名称匹配。 与该规则冲突将使库的可用性下降。 |
|
CA1725 |
以一致的方式命名重写层次结构中的参数可以提高方法重写的可用性。 如果派生方法中的参数名与基声明中的名称不同,可能会导致无法区分出该方法是基方法的重写还是该方法的新重载。 |
|
CA1726 |
在外部可见的标识符的名称中,包括一个存在首选备用词条的词条。 或者,名称中包含“Flag”或“Flags”一词。 |
|
CA1800 |
重复强制转换会降低性能,特别是在精简的迭代语句中执行强制转换时。 |
|
CA1801 |
方法签名包含一个没有在方法体中使用的参数。 |
|
CA1802 |
某个字段被声明为 static 和 read-only(在 Visual Basic 中为 Shared 和 ReadOnly),并使用可在编译时计算的值初始化。 因为赋给目标字段的值可在编译时计算,所以,请将声明更改为 const(在 Visual Basic 中为 Const)字段,以便该值在编译时(而非运行时)计算。 |
|
CA1804 |
未使用的局部变量和不必要的赋值会增加程序集的大小并降低性能。 |
|
CA1806 |
创建一个新对象,但从不使用该对象;或者调用会创建并返回一个新字符串的方法,但从不使用这个新字符串;或者 COM 或 P/Invoke 方法返回一个从不使用的 HRESULT 或错误代码。 |
|
CA1809 |
优化性能的常见方法是将值存储于处理器寄存器,而不是内存中,这称为“注册值”。 若要提高所有的局部变量都能注册的机会,应将局部变量的数目限制在 64 个以内。 |
|
CA1810 |
当一个类型声明显式静态构造函数时,实时 (JIT) 编译器会向该类型的每个静态方法和实例构造函数中添加一项检查,以确保之前已调用该静态构造函数。 静态构造函数检查会降低性能。 |
|
CA1811 |
某个私有或内部(程序集级别)成员在程序集中没有调用方,既不是由公共语言运行时调用的,也不是由委托调用的。 |
|
CA1812 |
程序集级别类型的实例不是由程序集中的代码创建的。 |
|
CA1813 |
.NET Framework 类库提供用于检索自定义特性的方法。 默认情况下,这些方法搜索特性继承层次结构。 通过密封特性,将无需搜索继承层次结构,且能够提高性能。 |
|
CA1814 |
交错数组是元素为数组的数组。 构成元素的数组可以是不同的大小,以减少某些数据集的浪费空间。 |
|
CA1815 |
对于值类型,Equals 的继承的实现使用反射库,并比较所有字段的内容。 反射需要消耗大量计算资源,可能没有必要比较每一个字段是否相等。 如果希望用户对实例进行比较或排序,或者希望用户将实例用作哈希表键,则值类型应实现 Equals。 |
|
CA1816 |
作为 Dispose 的实现的某个方法未调用 GC.SuppressFinalize;或者不是 Dispose 的实现的某个方法调用了 GC.SuppressFinalize;或者某个方法调用了 GC.SuppressFinalize 并传递 this(在 Visual Basic 中是 Me)以外的某个值。 |
|
CA1819 |
即使属性是只读的,该属性返回的数组也不是写保护的。 若要使数组不会被更改,属性必须返回数组的副本。 通常,用户不能理解调用这种属性的负面性能影响。 |
|
CA1820 |
使用 String.Length 属性或 String.IsNullOrEmpty 方法比较字符串要比使用 Equals 的速度快得多。 |
|
CA1821 |
应尽可能避免终结器,因为跟踪对象生存期会产生额外的性能系统开销。 空的终结器只会徒增系统开销,没有一点好处。 |
|
CA1822 |
可以将不访问实例数据或不调用实例方法的成员标记为 static(在 Visual Basic 中为 Shared)。 在将这些方法标记为 static 之后,编译器将向这些成员发出非虚拟调用站点。 这会使性能敏感的代码的性能得到显著提高。 |
|
CA1823 |
检测到程序集内有似乎未访问过的私有字段。 |
|
CA1824 |
NeutralResourcesLanguage 特性通知 ResourceManager 用于显示程序集的非特定区域性资源的语言。 这将改进所加载的第一个资源的查找性能,并缩小工作集。 |
|
CA1900 |
此规则对以下项进行检查:当用显式布局声明的结构封送到 64 位操作系统上的非托管代码时,是否正确对齐。 |
|
CA1901 |
此规则计算 P/Invoke 的每个参数和返回值的大小,还验证它们在封送到 32 位和 64 位操作系统上的非托管代码时参数的大小是否正确。 |
|
CA1903 |
一个成员或类型使用了某个 Service Pack 中引入的成员或类型,该 Service Pack 没有与项目的目标框架一起包括。 |
|
CA2000 |
由于可能发生异常事件,导致对象的终结器无法运行,因此,应显式释放对象,以避免对该对象的所有引用超出范围。 |
|
CA2001 |
某个成员调用可能存在危险或有问题的方法。 |
|
CA2002 |
当可以跨应用程序域边界直接进行访问对象时,则认为该对象具有弱标识。 对于尝试获取对具有弱标识的对象的锁的线程,该线程可能会被其他应用程序域中持有对同一对象的锁的另一线程所阻止。 |
|
CA2003 |
托管线程被视为 Win32 线程。 |
|
CA2004 |
如果转换为使用 SafeHandle,请移除所有对 GC.KeepAlive (object) 的调用。 在这种情况下,类不必调用 GC.KeepAlive。 这将假定它们没有终结器,而只是依赖 SafeHandle 来为它们完成 OS 句柄。 |
|
CA2006 |
在托管代码中使用 IntPtr 可能意味着潜在的安全性和可靠性方面的问题。 必须检查所有使用 IntPtr 之处,以确定是否需要在该处使用 SafeHandle 或类似的技术。 |
|
CA2100 |
一个方法使用按该方法的字符串参数生成的字符串设置 System.Data.IDbCommand.CommandText 属性。 此规则假定字符串参数中包含用户输入。 基于用户输入生成的 SQL 命令字符串易于受到 SQL 注入式攻击。 |
|
CA2101 |
某平台调用成员允许部分受信任的调用方,具有一个字符串参数,并且不显式封送该字符串。 这可能导致潜在的安全漏洞。 |
|
CA2102 |
程序集中未用 RuntimeCompatibilityAttribute 标记或用 RuntimeCompatibility(WrapNonExceptionThrows = false) 标记的某个成员包含一个处理 System.Exception 的 catch 块,而不包含紧跟其后的一般 catch 块。 |
|
CA2103 |
某个方法使用命令性安全,并且可能正在使用在要求处于活动状态时可以更改的状态信息或返回值来构造权限。 应尽可能使用声明性安全。 |
|
CA2104 |
外部可见类型包含外部可见的只读字段,该字段为可变的引用类型。 可变类型是实例数据可被修改的类型。 |
|
CA2105 |
向包含数组的字段应用 readonly(在 Visual Basic 中为 ReadOnly)修饰符时,无法将该字段更改为引用其他数组。 但是,可以更改在只读字段中存储的数组的元素。 |
|
CA2106 |
某个方法断言权限,但不对调用方执行任何安全检查。 如果在不执行任何安全检查的情况下断言安全权限,则会在代码中留下可利用的安全漏洞。 |
|
CA2107 |
PermitOnly 方法和 CodeAccessPermission.Deny 安全操作只应由掌握 .NET Framework 高级安全知识的人员使用。 应当对使用这些安全操作的代码进行安全检查。 |
|
CA2108 |
公共或受保护值类型受数据访问或链接要求保护。 |
|
CA2109 |
检测到公共事件处理方法或受保护事件处理方法。 除非绝对必要,否则不应公开事件处理方法。 |
|
CA2111 |
指针不是私有、内部或只读指针。 恶意代码可以更改指针的值,这样就有可能访问内存中的任意位置或导致应用程序或系统故障。 |
|
CA2112 |
一个公共或受保护类型包含公共字段,并受链接要求保护。 如果代码可以访问受链接要求保护的类型的实例,则该代码不必满足此链接要求就可以访问该类型的字段。 |
|
CA2114 |
一个方法不应同时有同一操作的方法级别和类型级别的声明性安全。 |
|
CA2115 |
该规则检测由于在非托管代码仍在使用非托管资源时终止该非托管资源而可能发生的错误。 |
|
CA2116 |
当完全受信任的程序集上存在 APTCA (AllowPartiallyTrustedCallersAttribute) 时,如果该程序集执行另一个不允许部分受信任调用方的程序集中的代码,则可能会产生安全漏洞。 |
|
CA2117 |
当完全受信任的程序集上存在 APTCA 时,如果程序集中的某个类型是从不允许部分受信任调用方的类型继承而来,则可能会产生安全漏洞。 |
|
CA2118 |
SuppressUnmanagedCodeSecurityAttribute 为执行使用 COM 互操作或操作系统调用的非托管代码的成员更改默认的安全系统行为。 此特性主要用于提高性能;不过,提高性能的同时会显著增加安全风险。 |
|
CA2119 |
可继承的公共类型为内部(在 Visual Basic 中为 Friend)接口提供可重写的方法实现。 若要修复与此规则的冲突,请禁止方法在程序集外重写。 |
|
CA2120 |
此类型的构造函数采用了 System.Runtime.Serialization.SerializationInfo 对象和 System.Runtime.Serialization.StreamingContext 对象(序列化构造函数的签名)。 此构造函数不受安全检查的保护,但类型中的一个或多个常规构造函数受保护。 |
|
CA2121 |
系统在创建第一个类型实例或引用任何静态成员之前调用静态构造函数。 如果静态构造函数不是私有,则系统以外的代码可以调用它。 根据构造函数中执行的操作,这可能导致意外行为。 |
|
CA2122 |
公共或受保护成员具有链接要求,且由不执行任何安全检查的成员调用。 链接请求仅检查直接调用方的权限。 |
|
CA2123 |
该规则将一个方法与其基方法(该基方法为另一个类型中的接口或虚方法)相匹配,然后比较两者的链接请求。 如果与此规则冲突,则恶意调用方只需调用不安全的方法,即可跳过该链接要求。 |
|
CA2124 |
公共或受保护方法中含有 try/finally 块。 finally 块似乎要重置安全状态,并且自身不包括在某个 finally 块中。 |
|
CA2126 |
一个公共的非密封类型受链接要求保护,并且具有可重写的方法。 类型和方法都不受继承要求保护。 |
|
CA2127 |
在完全透明的程序集中不能出现关键代码。 此规则分析完全透明的程序集在类型、字段和方法级别是否有任何 SecurityCritical 批注。 |
|
CA2128 |
此规则分析完全透明或混合透明/关键的程序集中的所有方法和类型,并标记 Assert 的任何声明性或命令性用法。 |
|
CA2129 |
用 SecurityTransparentAttribute 标记的方法调用标为 SecurityCritical 的非公共成员。 此规则分析混合透明/关键的程序集中的所有方法和类型,并标记透明代码中对未标为 SecurityTreatAsSafe 的非公共关键代码的任何调用。 |
|
CA2130 |
未对常数值实施透明强制,因为编译器内联常数值以便在运行时不需要查找。 常数字段应为安全透明的,以便代码评审阅者不会假定透明代码不能访问常数。 |
|
CA2131 |
某个类型参与了类型等效,该类型本身或该类型的成员或字段用 SecurityCriticalAttribute 特性标记。 对于任何关键的类型或包含参与类型等效的关键方法或字段的类型,将引发此规则。 当 CLR 检测到这样的类型时,在运行时将不会加载它并引发 TypeLoadException。 通常,仅在用户手动实现类型等效而不是通过依赖 tlbimp 和编译器进行类型等效时,才会引发此规则。 |
|
CA2132 |
具有 SecurityCriticalAttribute 的类型和成员无法供 Silverlight 应用程序代码使用。 安全关键类型和成员只能供 .NET Framework for Silverlight 类库中的受信任代码使用。 因为派生类中的某个公共或受保护构造必须有与其基类相同或更大的透明度,所以不能从标记为 SecurityCritical 类中派生应用程序中的类。 |
|
CA2133 |
将对一个具有以下特点的方法引发此警告:该方法将用 SecurityCriticalAttribute 标记的委托绑定到一个透明的或用 SecuritySafeCriticalAttribute 标记的方法。 还会对另一个具有以下特点的方法引发此警告:该方法将透明的或安全关键的委托绑定到一个关键方法。 |
|
CA2134 |
当用 SecurityCriticalAttribute 标记的方法重写一个透明的或用 SecuritySafeCriticalAttribute 标记的方法时,将会引发此规则。 当一个透明的或用 SecuritySafeCriticalAttribute 标记的方法重写一个用 SecurityCriticalAttribute 标记的方法时,也会引发此规则。 该规则在重写虚方法或实现接口时应用。 |
|
CA2135 |
在级别为 2 的安全规则集中已弃用 LinkDemand。 现在使用 SecurityCriticalAttribute 特性标记方法、类型和字段,而不是使用 LinkDemand 在实时 (JIT) 编译时进行强制安全检查。 |
|
CA2136 |
将透明特性从较大作用域的代码元素应用到较小作用域的元素。 具有较大作用域的代码元素的透明特性优于第一个元素中包含的代码元素的透明特性。 例如,用 SecurityCriticalAttribute 特性标记的类不能包含用 SecuritySafeCriticalAttribute 特性标记的方法。 |
|
CA2137 |
某个方法包含无法验证的代码或通过引用返回类型。 在尝试通过安全透明代码执行无法验证的 Microsoft 中间语言 (MSIL) 时将引发此规则。 但是,此规则不包含完整的 IL 验证程序,而是使用试探法来捕捉 MSIL 验证的大部分冲突。 |
|
CA2138 |
一个安全透明方法调用使用 SuppressUnmanagedCodeSecurityAttribute 特性标记的方法。 |
|
CA2139 |
任何透明的并尝试通过使用 HandleProcessCorruptedStateExceptionsAttribute 特性处理进程损坏异常的方法将会引发此规则。 进程损坏异常属于异常的 CLR 版本 4.0 异常分类,如 AccessViolationException。 HandleProcessCorruptedStateExceptionsAttribute 特性只由安全关键方法使用,并且如果应用于透明的方法,则将被忽略。 |
|
CA2140 |
用 SecurityCriticalAttribute 特性标记的代码元素是安全关键的。 透明方法不能使用安全关键元素。 如果透明类型尝试使用安全关键类型,则会引发 TypeAccessException、MethodAccessException 或 FieldAccessException。 |
|
CA2141 |
安全透明方法调用未用 APTCA 特性标记的程序集中的方法,或者安全透明方法满足某个类型或方法的 LinkDemand。 |
|
CA2142 |
对于需要 LinkDemand 来访问它们的透明方法,将会引发此规则。 安全透明代码不应负责验证某个操作的安全,因此不应要求权限。 |
|
CA2143 |
安全透明代码不应负责验证某个操作的安全,因此不应要求权限。 安全透明代码应使用完整的需求来作出安全决策并且安全关键代码不应依赖透明代码以进行完全的请求。 |
|
CA2144 |
透明代码安全检查不像关键代码的安全检查一样全面,因为透明代码不能执行安全敏感的操作。 从字节数组中加载的程序集在透明代码中可能不会被注意到,并且该字节数组可能包含确实需要审核的关键或更重要的安全关键代码。 |
|
CA2145 |
用 SuppressUnmanagedCodeSecurityAttribute 特性修饰的方法有一个隐式的 LinkDemand 作用于调用它的任何方法。 此 LinkDemand 要求调用代码是关键安全的。 用 SecurityCriticalAttribute 特性标记使用 SuppressUnmanagedCodeSecurity 的方法会使此要求对方法的调用方更加明显。 |
|
CA2146 |
当派生类型具有的安全透明特性与其基类型或实现的接口不是同样关键时,将引发此规则。 只有关键类型可以从关键基类型派生或实现关键接口,并且只有关键或关键安全类型可以从安全关键基类型派生或实现关键安全接口。 |
|
CA2147 |
标记为 SecurityTransparentAttribute 的代码未被授予足够的权限进行断言。 |
|
CA2149 |
对于直接调用到本机代码中(例如通过使用 P/Invoke)的任何透明方法,将引发此规则。 违反此规则会导致级别 2 透明度模型中的 MethodAccessException,以及级别 1 透明度模型中对 UnmanagedCode 的完全要求。 |
|
CA2200 |
再次引发某个异常,在 throw 语句中显式指定了该异常。 如果通过在 throw 语句中指定异常来重新引发该异常,则引发该异常的原始方法与当前方法之间的方法调用的列表将丢失。 |
|
CA2201 |
这使得很难检测和调试原始错误。 |
|
CA2202 |
某个方法实现所包含的代码路径可能导致对同一对象多次调用 System.IDisposable.Dispose 或与 Dispose 等效的方法(例如,用于某些类型的 Close() 方法)。 |
|
CA2204 |
方法体中的文本字符串包含一个或多个未被 Microsoft 拼写检查器库识别的单词。 |
|
CA2205 |
定义了操作系统调用方法,但在 .NET Framework 类库中存在具有等效功能的方法。 |
|
CA2207 |
某值类型声明了显式静态构造函数。 要修复与该规则的冲突,请在声明它时初始化所有静态数据并移除静态构造函数。 |
|
CA2208 |
调用了异常类型 ArgumentException 或其派生类型的默认(无参数)构造函数,或者向异常类型 ArgumentException 或其派生类型的参数化构造函数传递了错误的字符串参数。 |
|
CA2210 |
强名称可避免客户端在不知情的情况下加载已被篡改的程序集。 除非极为有限的几种情况,否则不应部署没有强名称的程序集。 如果共享或发布未正确签名的程序集,则该程序集可能被篡改,公共语言运行时可能不会加载该程序集;而用户可能必须在他/她的计算机上禁用验证。 |
|
CA2211 |
不是常数也不是只读字段的静态字段不是线程安全的。 必须严格控制对这类字段的访问,并需要高级编程技术来同步对类对象的访问。 |
|
CA2212 |
继承自 System.EnterpriseServices.ServicedComponent 的类型中的方法标记有 System.Web.Services.WebMethodAttribute。 因为 WebMethodAttribute 和 ServicedComponent 方法在上下文和事务流方面的行为和要求有冲突,所以该方法的行为在某些情况下会不正确。 |
|
CA2213 |
实现 System.IDisposable 的类型声明了同样实现 IDisposable 的类型的字段。 字段的 Dispose 方法不由声明类型的 Dispose 方法调用。 |
|
CA2214 |
构造函数调用虚方法时,可能尚未执行调用该方法的实例的构造函数。 |
|
CA2215 |
如果类型继承自可释放类型,则必须从它自己的 Dispose 方法中调用基类型的 Dispose 方法。 |
|
CA2216 |
实现 System.IDisposable 并包含建议使用非托管资源的字段的类型未实现 Object.Finalize 所描述的终结器。 |
|
CA2217 |
外部可见的枚举使用 FlagsAttribute 标记,并且它包含的一个或多个值不是 2 的幂或不是为该枚举定义的其他值的组合。 |
|
CA2218 |
GetHashCode 基于当前实例返回一个适合哈希算法和哈希表之类的数据结构的值。 两个相等的同类型对象必须返回相同的哈希代码。 |
|
CA2219 |
如果在 finally 或 fault 子句中引发异常,新异常将隐藏活动异常。 当在 filter 子句中引发异常时,运行时会在不提示的情况下捕捉异常。 这使得很难检测和调试原始错误。 |
|
CA2220 |
终止必须通过继承层次结构传播。 为确保这一点,类型必须从其自身的 Finalize 方法调用它们的基类 Finalize 方法。 |
|
CA2221 |
终结器必须使用族访问修饰符。 |
|
CA2222 |
不能更改所继承成员的访问修饰符。 将继承的成员更改为私有成员不能防止调用方访问该方法的基类实现。 |
|
CA2223 |
虽然公共语言运行时允许使用返回类型区分其余部分都相同的成员,但该功能不包含在公共语言规范中,也不是各种 .NET 编程语言的共同功能。 |
|
CA2224 |
某公共类型实现了等号运算符,但是没有重写 Object.Equals。 |
|
CA2225 |
检测到运算符重载,但未找到预期的指定备用方法。 命名的备用成员提供了对与运算符相同的功能的访问,它提供给开发人员,在用不支持重载运算符的语言进行编程时使用。 |
|
CA2226 |
某个类型实现了相等运算符或不等运算符,却未实现相反运算符。 |
|
CA2227 |
使用可写的集合属性,用户可以将该集合替换为不同的集合。 只读属性禁止替换该集合,但仍允许设置单个成员。 |
|
CA2228 |
使用 .NET Framework 的预发行版生成的资源文件可能无法用于受支持的 .NET Framework 版本。 |
|
CA2229 |
要修复与该规则的冲突,请实现序列化构造函数。 对于密封类,请使构造函数成为私有;否则,请使构造函数成为受保护。 |
|
CA2230 |
公共或受保护类型包含一个使用 VarArgs 调用约定(而不是 params 关键字)的公共或受保护方法。 |
|
CA2231 |
值类型重写 Object.Equals,但未实现相等运算符。 |
|
CA2232 |
STAThreadAttribute 指示应用程序的 COM 线程模型是单线程单元。 使用 Windows 窗体的任何应用程序的入口点上必须存在此特性;如果没有此特性,则 Windows 组件可能无法正常工作。 |
|
CA2233 |
如果未首先验证操作数,则不应执行算术运算。 这将确保运算结果不会超出所涉及数据类型的允许值范围。 |
|
CA2234 |
调用了带有一个字符串参数的方法,该参数的名称中包含“uri”、“URI”、“urn”、“URN”、“url”或“URL”。 此方法的声明类型包含具有 System.Uri 参数的对应方法重载。 |
|
CA2235 |
在可以序列化的类型中声明了类型不可序列化的实例字段。 |
|
CA2236 |
若要修复与该规则的冲突,请从相应的派生类型方法或构造函数调用基类型 GetObjectData 方法或序列化构造函数。 |
|
CA2237 |
若要被公共语言运行时识别为可序列化,类型必须用 SerializableAttribute 特性标记,即使该类型通过实现 ISerializable 接口使用了自定义的序列化例程也是如此。 |
|
CA2238 |
处理序列化事件的方法的签名、返回类型或可见性不正确。 |
|
CA2239 |
某个类型有一个使用 System.Runtime.Serialization.OptionalFieldAttribute 特性标记的字段,并且该类型没有提供反序列化事件处理方法。 |
|
CA2240 |
若要修复与该规则的冲突,请使 GetObjectData 方法可见且可以重写,并确保所有实例字段都包括在序列化进程中,或者使用 NonSerializedAttribute 特性显式标记所有实例字段。 |
|
CA2241 |
传递给 System.String.Format 的 format 参数不包含对应于每个对象参数的格式项,反之亦然。 |
|
CA2242 |
此表达式对照 Single.Nan 或 Double.Nan 测试某个值。 使用 Single.IsNan(Single) 或 Double.IsNan(Double) 测试该值。 |
|
CA2243 |
特性的字符串文本参数不能正确解析为 URL、GUID 或版本。 |