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 9 | 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:
- Secara default, aturan mengecualikan
System
jenis dari namespace. Anda juga dapat mengonfigurasi aturan untuk mengecualikan jenis atau namespace lainnya . - Anda dapat mengonfigurasi kedalaman pohon pewarisan tempat aturan ini diaktifkan.
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.
Buat file teks bernama CodeMetricsConfig.txt.
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.
Dalam file proyek, tandai tindakan build 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 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 MyType1 MyType2 atau yang berisi namespace berisi atau MyType1 MyType2 (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