CA1501:避免过度继承

属性
规则 ID CA1501
标题 避免过度继承
类别 可维护性
修复是中断修复还是非中断修复 重大
默认阈值 5
在 .NET 8 中默认启用

原因

类型在继承层次结构中的深度超过五级。

规则说明

深度嵌套的类型层次结构可能很难遵循、理解和维护。 此规则将分析限制在同一模块内的层次结构中。

可以按下列方式配置此规则:

如何解决冲突

要解决此规则的冲突,请从继承层次结构中不太深入的基类型中派生类型,或者删除部分中间基类型。

何时禁止显示警告

可以安全地禁止显示此规则的警告。 但代码可能较难维护。 根据基类型的可见性,解决此规则的冲突可能会造成中断性变更。 例如,删除公共基类型是一项中断性变更。

注意

如果满足以下所有条件,你可能会看到来自此规则的误报警告:

  • 你将 Visual Studio 2022 版本 17.5 或更高版本与旧版 .NET SDK(即 .NET 6 或更低版本)配合使用。
  • 你使用的是 .NET 6 SDK 中的分析器或较旧版本的分析器包,例如 Microsoft.CodeAnalysis.FxCopAnalyzers。

误报是由于 C# 编译器中的中断性变更造成的。 请考虑使用更新的包含误报警告修补程序的分析器。 升级到 Microsoft.CodeAnalysis.NetAnalyzers 版本 7.0.0-preview1.22464.1 或更高版本,或使用 .NET 7 SDK 中的分析器。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA1501
// The code that's violating the rule is on this line.
#pragma warning restore CA1501

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA1501.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

配置阈值

可以配置此规则触发的阈值。

  1. 创建名为 CodeMetricsConfig.txt 的文本文件。

  2. 按以下格式将所需的阈值添加到文本文件中:

    CA1501: 8
    

    在此示例中,规则配置为在类型在其继承层次结构中深达 8 个或更多级别时触发。

  3. 在项目文件中,将配置文件的生成操作标记为 AdditionalFiles。 例如:

    <ItemGroup>
      <AdditionalFiles Include="CodeMetricsConfig.txt" />
    </ItemGroup>
    

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

可以仅为此规则、为适用的所有规则或为适用的此类别(可维护性)中的所有规则配置此选项。 有关详细信息,请参阅代码质量规则配置选项

继承排除的类型或命名空间名称

可以将规则配置为从继承层次结构树中排除某些类型或命名空间。 默认情况下,将排除 System.* 命名空间中的所有类型。 无论你设置什么值,都将添加此默认值。

选项值 总结
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType 匹配所有名为 MyType 的类型或其命名空间包含 MyType 的类型(以及 System 命名空间中的所有类型)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 匹配所有名为 MyType1MyType2 的类型,或其命名空间包含 MyType1MyType2 的类型(以及 System 命名空间中的所有类型)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType 匹配 NS 命名空间中的特定类型 MyType(以及 System 命名空间中的所有类型)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 匹配具有相应的完全限定名称的特定类型 MyType1MyType2(以及 System 命名空间中的所有类型)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS 匹配 NS 命名空间中的所有类型(以及 System 命名空间中的所有类型)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* 匹配其名称以 My 开头的所有类型,或其命名空间部分以 My 开头的所有类型(以及 System 命名空间中的所有类型)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* 匹配 NS 命名空间中名称以 My 开头的所有类型(以及 System 命名空间中的所有类型)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* 匹配命名空间以 My 开头的所有类型(以及 System 命名空间中的所有类型)

示例

下面的示例演示了与此规则冲突的类型:

class BaseClass {}
class FirstDerivedClass : BaseClass {}
class SecondDerivedClass : FirstDerivedClass {}
class ThirdDerivedClass : SecondDerivedClass {}
class FourthDerivedClass : ThirdDerivedClass {}

// This class violates the rule.
class FifthDerivedClass : FourthDerivedClass {}
Imports System

Namespace ca1501

    Class BaseClass
    End Class

    Class FirstDerivedClass
        Inherits BaseClass
    End Class

    Class SecondDerivedClass
        Inherits FirstDerivedClass
    End Class

    Class ThirdDerivedClass
        Inherits SecondDerivedClass
    End Class

    Class FourthDerivedClass
        Inherits ThirdDerivedClass
    End Class

    ' This class violates the rule.
    Class FifthDerivedClass
        Inherits FourthDerivedClass
    End Class

End Namespace