CA1501:継承を使用しすぎないでください

プロパティ
ルール ID CA1501
Title 継承を使用しすぎないでください
[カテゴリ] 保守容易性
修正が中断ありか中断なしか あり
既定のしきい値 5
.NET 8 では既定で有効 いいえ

原因

型が、その継承階層内の 5 つ以上深いレベルにあります。

規則の説明

深いレベルで入れ子にされた型の確認、理解、および保守は困難です。 この規則は、分析を同じモジュール内の階層に限定します。

この規則は、以下のような方法で構成できます:

違反の修正方法

この規則違反を修正するには、継承階層にある深度の深くない基本データ型から型を派生させるか、一部の中間基本データ型を削除します。

どのようなときに警告を抑制するか

この規則による警告を抑制しても問題ありません。 ただし、コードの保守が困難になることがあります。 基本データ型の可視性によっては、この規則違反の解決によって、破壊的変更が生じる場合があります。 たとえば、パブリック基本データ型の削除は、破壊的変更になります。

Note

次のすべてに該当する場合、このルールから擬陽性の警告が表示される場合があります。

  • 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 MyType1 または MyType2 と名前が付けられたすべての型、あるいは含まれる名前空間に MyType1 または MyType2 が含まれるすべての型 (および 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 それぞれの完全修飾名を持つ特定の型 MyType1 および MyType2 (および 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