CA1501: Hindari warisan yang berlebihan

Properti Nilai
ID Aturan CA1501
Judul Hindari pewarisan yang berlebihan
Kategori Kemampu
Perbaikan bersifat merusak atau tidak merusak Merusak
Ambang batas bawaan 5
Diaktifkan secara default di .NET 10 Tidak
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Suatu tipe memiliki lima atau lebih tingkat dalam hierarki pewarisannya.

Deskripsi aturan

Hierarki jenis yang sangat berlapis dapat menjadi sulit untuk diikuti, dipahami, dan dipelihara. Aturan ini membatasi analisis hierarki dalam modul yang sama.

Anda dapat mengonfigurasi aturan ini dengan cara berikut:

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, turunkan tipe dari tipe dasar yang kurang dalam dalam hierarki pewarisan atau hilangkan beberapa tipe dasar perantara.

Kapan harus menekan peringatan

Aman untuk menekan peringatan dari aturan ini. Namun, kode mungkin lebih sulit dipertahankan. Bergantung pada visibilitas jenis dasar, dalam menyelesaikan pelanggaran aturan ini mungkin dapat membuat perubahan yang merusak. Misalnya, menghapus jenis dasar publik adalah perubahan mendasar.

Catatan

Anda mungkin melihat peringatan positif palsu dari aturan ini jika semua hal berikut ini berlaku:

  • Anda menggunakan Visual Studio 2022 versi 17.5 atau yang lebih baru dengan versi .NET SDK yang lebih lama, yaitu, .NET 6 atau yang lebih lama.
  • Anda menggunakan penganalisis dari .NET 6 SDK atau versi paket penganalisis yang lebih lama, seperti Microsoft.CodeAnalysis.FxCopAnalyzers.

Positif palsu disebabkan oleh perubahan besar dalam kompiler C#. Pertimbangkan untuk menggunakan penganalisis yang lebih baru yang berisi perbaikan untuk peringatan positif palsu. Tingkatkan ke Microsoft.CodeAnalysis.NetAnalyzers versi 7.0.0-preview1.22464.1 atau yang lebih baru atau gunakan penganalisis dari .NET 7 SDK.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

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

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

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

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Mengonfigurasi ambang batas

Anda dapat mengonfigurasi ambang di mana aturan ini diaktifkan.

  1. Buat file teks bernama CodeMetricsConfig.txt.

  2. Tambahkan ambang yang diinginkan ke file teks dalam format berikut:

    CA1501: 8
    

    Dalam contoh ini, aturan dikonfigurasi untuk diaktifkan ketika jenis memiliki delapan tingkat atau lebih dalam hierarki warisannya.

  3. Dalam file proyek, tandai aksi build untuk file konfigurasi sebagai AdditionalFiles. Contohnya:

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

Mengonfigurasi kode yang akan dianalisis

Gunakan opsi berikut untuk mengonfigurasi bagian mana dari codebase Anda yang akan menjalankan aturan ini.

Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang berlaku untuknya, atau untuk semua aturan dalam kategori ini (Maintainability) yang diterapkannya. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.

Nama tipe atau namespace yang dikecualikan dari pewarisan

Anda dapat mengonfigurasi aturan untuk mengecualikan jenis atau namespace tertentu dari pohon hierarki pewarisan. Secara default, semua jenis dari System.* namespace dikecualikan. Apa pun nilai yang Anda tetapkan, nilai default ini ditambahkan.

Nilai Opsi Ringkasan
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType Cocok dengan semua jenis yang bernama MyType atau yang namespace-nya berisi MyType (dan semua jenis dari namespace System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 Cocok dengan semua jenis yang bernama baik MyType1 atau MyType2 atau namespace-nya yang mengandung baik MyType1 atau MyType2 (dan semua jenis dari namespace System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType Cocok dengan jenis MyType tertentu di namespace NS (dan semua jenis dari namespace System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 Mencocokkan jenis MyType1 dan MyType2 yang spesifik dengan nama lengkap yang memenuhi syarat masing-masing (dan semua jenis dari ruang nama System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS Mencocokkan semua tipe dari NS namespace (dan semua tipe dari System namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* Cocok dengan semua jenis yang namanya dimulai dengan My atau bagian namespace yang berisi jenis yang dimulai dengan My (dan semua jenis dari namespace System)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* Cocok dengan semua jenis yang dimulai dengan nama My di NS namespace (dan semua jenis dari System namespace)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* Cocok dengan semua jenis yang namespace-nya dimulai dengan My (dan semua jenis dari namespace System)

Contoh

Contoh berikut menunjukkan jenis yang melanggar aturan:

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