分享方式:


CA1501:避免在物件間過度繼承

屬性
規則識別碼 CA1501
標題 避免在物件間過度繼承
類別 可維護性
修正程式是中斷或非中斷 中斷
默認閾值 5
預設在 .NET 8 中啟用 No

原因

類型是其繼承階層中的五個以上層級。

檔案描述

太深的巢狀類型階層架構可能會難以依循、了解和維護。 此規則會將分析限制為相同課程模組中的階層。

您可以透過下列方式設定此規則:

如何修正違規

若要修正此規則的違規,請從繼承階層中較不深的基底類型衍生類型,或排除某些中繼基底類型。

隱藏警告的時機

隱藏此規則的警告是安全的。 不過,程式代碼可能更難維護。 根據基底類型的可見度,解決此規則的違規可能會造成重大變更。 例如,移除公用基底類型是重大變更。

注意

如果適用下列所有專案,您可能會看到來自此規則的誤判警告:

  • 您使用 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
    

    在此範例中,當類型在其繼承階層中深度為八個或多個層級時,規則會設定為引發。

  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 或 或 且包含命名空間的所有型別包含 MyType1MyType2MyType2 (以及命名空間中的所有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