Bagikan melalui


CA1501: Hindari warisan yang berlebihan

Properti Nilai
ID Aturan CA1501
Judul Hindari pewarisan yang berlebihan
Golongan Kemampu
Perbaikan bersifat disruptif atau non-disruptif Merusak
Ambang default 5
Diaktifkan secara default di .NET 8 No

Penyebab

Jenisnya adalah lima tingkat atau lebih dalam dalam hierarki warisannya.

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, dapatkan jenis dari jenis dasar yang kurang dalam dalam hierarki warisan atau hilangkan beberapa jenis dasar perantara.

Kapan harus menekan peringatan

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

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 yang melanggar dalam pengkompilasi 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 adalah delapan tingkat atau lebih jauh dalam hierarki warisannya.

  3. Dalam file proyek, tandai tindakan build file konfigurasi sebagai AdditionalFiles. Misalnya:

    <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 layanan yang dikecualikan 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 bernama MyType atau yang berisi namespace layanan berisi MyType (dan semua jenis dari System namespace layanan)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 Cocok dengan semua jenis bernama atau MyType1MyType2 atau yang berisi namespace berisi atau MyType1MyType2 (dan semua jenis dari System namespace layanan)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType Cocok dengan jenis MyType tertentu di namespace NS (dan semua jenis dari System namespace layanan)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 Cocok dengan jenis MyType1 tertentu dan MyType2 dengan masing-masing nama yang sepenuhnya memenuhi syarat (dan semua jenis dari System namespace layanan)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS Cocok dengan semua jenis dari NS namespace layanan (dan semua jenis dari System namespace layanan)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* Cocok dengan semua jenis yang namanya dimulai dengan My atau yang berisi bagian namespace dimulai dengan My (dan semua jenis dari System namespace layanan)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* Cocok dengan semua jenis yang namanya dimulai dengan My di namespace NS (dan semua jenis dari System namespace layanan)
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* Cocok dengan semua jenis yang berisi namespace layanan dimulai dengan My (dan semua jenis dari System namespace layanan)

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