设计规则

设计规则支持遵守 .NET Framework 设计准则

本节内容

规则 描述
CA1000:不要在泛型类型上声明静态成员 调用泛型类型的静态成员时,必须为该类型指定类型参数。 调用不支持推理的泛型实例成员时,必须为该成员指定类型参数。 在这两种情况下,用于指定类型参数的语法是不同的,很容易混淆。
CA1001:具有可释放字段的类型应该是可释放的 类声明并实现一个实例字段,该字段是 System.IDisposable 类型,并且该类不实现 IDisposable。 声明 IDisposable 字段的类间接拥有非托管资源,并应实现 IDisposable 接口。
CA1002:不公开泛型列表 System.Collections.Generic.List<(<(T>)>)是一个通用集合,专为性能而不是继承而设计。 因此,List 不包含任何虚拟成员。 应改为公开针对继承设计的泛型集合。
CA1003:使用泛型事件处理程序实例 某个类型包含的委托返回 void,该委托的签名包含两个参数(第一个参数是对象,第二个参数是可以分配给 EventArgs 的类型),而且包含程序集针对的是 .NET Framework 2.0。
CA1005:避免泛型类型参数过多 泛型类型包含的类型参数越多,了解和记住每个类型参数所表示的内容就越困难。 通常,使用一个类型参数时,如 List<T>,情况很明显;在某些情况下,使用两个类型参数时,如 Dictionary<TKey, TValue>,也很明显。 但是,如果存在两个以上的类型参数,则对于大多数用户来说,难度会太大。
CA1008:枚举应具有零值 未初始化枚举的默认值(与其他值类型一样)为零。 非标志特性化枚举应使用零的值定义成员,以便默认值是枚举的有效值。 如果应用 FlagsAttribute 属性的枚举定义了零值成员,则其名称应为“None”,以指示枚举中未设置任何值。
CA1010:集合应实现泛型接口 若要扩大集合的可用性,请实现泛型集合接口之一。 然后,该集合可用于填充泛型集合类型。
CA1012:抽象类型不应具有公共构造函数 抽象类型的构造函数只能由派生类型调用。 由于公共构造函数创建类型的实例,并且无法创建抽象类型的实例,因此具有公共构造函数的抽象类型被错误设计。
CA1014:用 CLSCompliantAttribute 标记程序集 公共语言规范(CLS)定义程序集在编程语言之间使用时必须符合的命名限制、数据类型和规则。 良好的设计决定了所有程序集都使用 CLSCompliantAttribute 显式指示 CLS 符合性。 如果程序集上不存在此属性,则程序集不符合要求。
CA1016:用 AssemblyVersionAttribute 标记程序集 .NET 使用版本号唯一地标识程序集,并绑定到具有强名称的程序集中的类型。 版本号与版本和发布者策略一起使用。 默认情况下,应用程序仅使用生成它们的程序集版本运行。
CA1017:用 ComVisibleAttribute 标记程序集 ComVisibleAttribute 确定 COM 客户端如何访问托管代码。 良好的设计原则要求程序集明确指示 COM 可见性。 可以设置整个程序集的 COM 可见性,然后重写各个类型和类型成员的 COM 可见性。 如果此属性不存在,则程序集的内容对 COM 客户端可见。
CA1018:用 AttributeUsageAttribute 标记特性 定义自定义属性时,请使用 AttributeUsageAttribute 对其进行标记,以指示可在源代码中应用自定义属性的位置。 特性的含义和预期用法将确定其代码中的有效位置。
CA1019:为属性参数定义访问器 特性可以定义在将属性应用于目标时必须指定的必需参数。 这些参数也称为位置参数,因为它们作为位置参数提供给属性构造函数。 对于每个必需参数,该属性还应提供相应的只读属性,以便在执行时检索参数的值。 属性还可以定义可选参数,这些参数也称为命名参数。 这些参数按名称提供给属性构造函数,应具有相应的读/写属性。
CA1021:避免使用 out 参数 通过引用传递类型(使用 out 或 ref)需要具有指针的经验、了解值类型和引用类型的差异,以及处理具有多个返回值的方法。 此外,不广泛理解 out 和 ref 参数之间的差异。
CA1024:在适用处使用属性 公共或受保护的方法的名称以“Get”开头,不采用任何参数,并返回一个不是数组的值。 该方法可能很适于成为属性。
CA1027:用 FlagsAttribute 标记枚举 枚举是一个值类型,用于定义一组相关的命名常量。 当其命名常量可以有意义地组合时,将 FlagsAttribute 应用于枚举。
CA1028:枚举存储应为 Int32 枚举是一个值类型,用于定义一组相关的命名常量。 默认情况下,System.Int32 数据类型用于存储常量值。 尽管可以更改此基础类型,但大多数方案都不需要或建议这样做。
CA1030:在适用处使用事件 该规则检测名称通常用于事件的方法。 如果在响应明确定义的状态更改时调用了方法,则应由事件处理程序调用该方法。 调用该方法的对象应引发事件,而不是直接调用该方法。
CA1031:不要捕捉一般异常类型 不应捕捉一般异常。 捕捉更具体的异常,或者在执行 catch 块中的最后一条语句时重新引发一般异常。
CA1032:实现标准异常构造函数 未能提供完整的构造函数集可能会使无法正确处理异常。
CA1033:接口方法应由子类型调用 未密封的外部可见类型提供公共接口的显式方法实现,并且不提供具有相同名称的替代外部可见方法。
CA1034:嵌套类型不应可见 嵌套类型是在另一种类型的范围内声明的类型。 嵌套类型可用于封装包含类型的专用实现详细信息。 用于此目的,嵌套类型不应在外部可见。
CA1036:重写可比较类型中的方法 公共或受保护类型实现 System.IComparable 接口。 它不重写 Object.Equals,也不重载表示相等、不等、小于或大于的语言特定运算符。
CA1040:避免空接口 接口定义提供行为或使用协定的成员。 接口描述的功能可由任何类型采用,无论类型在继承层次结构中出现的位置如何。 类型通过为接口成员提供实现来实现接口。 空接口不定义任何成员;因此,它未定义可以实现的协定。
CA1041:提供已过时的特性消息 类型或成员使用 System.ObsoleteAttribute 特性进行标记,但未指定其 ObsoleteAttribute.Message 属性。 编译使用 ObsoleteAttribute 标记的类型或成员时,将显示属性的 Message 属性,该属性为用户提供有关已过时类型或成员的信息。
CA1043:对索引器使用整型或字符串参数 索引器(即索引属性)应对索引使用整型或字符串类型。 这些类型通常用于为数据结构编制索引,从而提高库的可用性。 对象类型的使用应仅限于在设计时无法指定特定整型或字符串类型的事例。
CA1044:属性不应是只写的 尽管具有只读属性是可以接受的,但通常有必要使用只读属性,但设计准则禁止使用仅写属性。 这是因为允许用户设置值,然后阻止用户查看该值,不提供任何安全性。 此外,如果没有读取访问权限,则无法查看共享对象的状态,这会限制其有用性。
CA1045:不要通过引用 传递类型 通过引用传递类型(使用 out 或 ref)需要具有指针的经验、了解值类型和引用类型的差异,以及处理具有多个返回值的方法。 为普通受众设计的代码库架构师不应期望用户熟练使用 out 或 ref 参数。
CA1046:不要对引用类型重载相等运算符 对于引用类型,相等运算符的默认实现几乎始终正确。 默认情况下,仅当两个引用指向同一对象时,两个引用才相等。
CA1047:不要在密封类型中声明受保护的成员 类型声明受保护的成员,以便继承类型可以访问或替代该成员。 根据定义,无法继承密封类型,这意味着无法调用密封类型的受保护方法。
CA1050:在命名空间中声明类型 类型在命名空间中声明,以防止名称冲突,并作为在对象层次结构中组织相关类型的一种方式。
CA1051:不要声明可见实例字段 字段的主要用途应作为实现详细信息。 字段应为 private 或 internal,并应通过使用属性公开这些字段。
CA1052:应密封静态容器类型 公共或受保护类型仅包含静态成员,而且没有用 sealed (C#) 或 NotInheritable (Visual Basic) 修饰符声明该类型。 不应继承的类型应使用密封修饰符进行标记,以防止其用作基类型。
CA1053:静态容器类型不应具有构造函数 公共或嵌套公共类型仅声明静态成员,并具有公共或受保护的默认构造函数。 不需要构造函数,因为调用静态成员不需要类型的实例。 字符串重载应使用字符串参数调用统一资源标识符(URI)重载,以确保安全性。
CA1054:URI 参数不应是字符串 如果方法采用 URI 的字符串表示形式,则应提供相应的重载,该重载采用 URI 类的实例,该实例以安全的方式提供这些服务。
CA1055:URI 返回值不应是字符串 此规则假定该方法返回 URI。 URI 的字符串表示形式容易分析和编码错误,并可能导致安全漏洞。 System.Uri 类以安全且安全的方式提供这些服务。
CA1056:URI 属性不应是字符串 此规则假定属性表示 URI。 URI 的字符串表示形式容易分析和编码错误,并可能导致安全漏洞。 System.Uri 类以安全且安全的方式提供这些服务。
CA1058:类型不应扩展某些基类型 外部可见的类型扩展某些基类型。 使用其中一种替代方法。
CA1060:将 P/Invoke 移动到 NativeMethods 类 平台调用方法(例如那些标记有 System.Runtime.InteropServices.DllImportAttribute 或使用 Visual Basic 中的 Declare 关键字定义的方法)用于访问非托管代码。 这些方法应为 NativeMethods、SafeNativeMethods 或 UnsafeNativeMethods 类。
CA1061:请勿隐藏基类方法 如果派生方法的参数签名只是在类型方面有所不同,而且与基方法的参数签名中的对应类型相比,这些类型的派生方式更弱,则基类型中的方法由派生类型中的同名方法隐藏。
CA1062:验证公共方法的参数 对于传递给外部可见方法的所有引用参数,应检查它们是否为 null。
CA1063:正确实现 IDisposable 所有 IDisposable 类型都应正确实现 Dispose 模式。
CA1064:异常应该是公共的 内部异常仅在其自己的内部范围内可见。 异常超出内部范围后,只能使用基本异常来捕获异常。 如果内部异常继承自 System.ExceptionSystem.SystemExceptionSystem.ApplicationException,则外部代码将没有足够的信息来知道该异常的用途。
CA1065:不要在意外的位置引发异常 不应引发异常的方法引发了异常。
CA1066:重写 Equals 时实现 IEquatable 值类型替代 Equals 方法,但不实现 IEquatable<T>
CA1067:实现 IEquatable 时重写 Equals 类型实现 IEquatable<T>,但不替代 Equals 方法。
CA1068:CancellationToken 参数必须最后出现 方法具有不是最后一个参数的 CancellationToken 参数。
CA1069:枚举不应具有重复值 枚举具有多个显式分配相同常量值的成员。
CA1070:请勿将事件字段声明为虚拟 类字段事件 被声明为虚拟事件。