CA1501: Aşırı devralmadan kaçın
Özellik | Değer |
---|---|
Kural Kimliği | CA1501 |
Başlık | Aşırı devralmadan kaçının |
Kategori | Bakýmýný |
Hataya neden olan veya bozulmayan düzeltme | Yeni |
Varsayılan eşik | 5 |
.NET 9'da varsayılan olarak etkin | Hayır |
Neden
Tür, devralma hiyerarşisinde beş veya daha fazla düzeydir.
Kural açıklaması
İç içe yuvalanmış hiyerarşileri izlemek, anlamak ve muhafaza etmek zor olabilir. Bu kural, analizi aynı modüldeki hiyerarşilerle sınırlar.
Bu kuralı aşağıdaki yollarla yapılandırabilirsiniz:
- Varsayılan olarak, kural türleri ad alanının dışında
System
tutar. Kuralı diğer türleri veya ad alanlarını da dışlamak için yapılandırabilirsiniz. - Bu kuralın tetiklendiği devralma ağacı derinliğini yapılandırabilirsiniz.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için, türü devralma hiyerarşisinde daha az derin olan bir temel türden türetin veya ara temel türlerden bazılarını ortadan kaldırın.
Uyarıların ne zaman bastırılması gerekiyor?
Bu kuraldan gelen bir uyarıyı engellemek güvenlidir. Ancak, kodu korumak daha zor olabilir. Temel türlerin görünürlüğüne bağlı olarak, bu kuralın ihlallerini çözmek hataya neden olan değişikliklere neden olabilir. Örneğin, genel temel türleri kaldırmak hataya neden olan bir değişikliktir.
Not
Aşağıdakilerin tümü geçerliyse bu kuraldan hatalı pozitif uyarılar görebilirsiniz:
- Visual Studio 2022 sürüm 17.5 veya üzerini .NET SDK'nın daha eski bir sürümüyle ( .NET 6 veya önceki bir sürüm) kullanıyorsunuz.
- .NET 6 SDK'sından çözümleyicileri veya çözümleyici paketlerinin Microsoft.CodeAnalysis.FxCopAnalyzers gibi eski bir sürümünü kullanıyorsunuz.
Hatalı pozitifler, C# derleyicisindeki hataya neden olan bir değişiklik nedeniyledir. Hatalı pozitif uyarıların düzeltmesini içeren daha yeni bir çözümleyici kullanmayı düşünün. Microsoft.CodeAnalysis.NetAnalyzers sürüm 7.0.0-preview1.22464.1 veya daha yeni bir sürüme yükseltin veya .NET 7 SDK'sından çözümleyicileri kullanın.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA1501
// The code that's violating the rule is on this line.
#pragma warning restore CA1501
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA1501.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Eşiği yapılandırma
Bu kuralın tetiklendiği eşiği yapılandırabilirsiniz.
CodeMetricsConfig.txt adlı bir metin dosyası oluşturun.
İstenen eşiği metin dosyasına aşağıdaki biçimde ekleyin:
CA1501: 8
Bu örnekte kural, bir tür devralma hiyerarşisinde sekiz veya daha fazla düzey derin olduğunda tetiklenen şekilde yapılandırılır.
Proje dosyasında yapılandırma dosyasının derleme eylemini AdditionalFiles olarak işaretleyin. Örneğin:
<ItemGroup> <AdditionalFiles Include="CodeMetricsConfig.txt" /> </ItemGroup>
Çözümlemek için kod yapılandırma
Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçeneği kullanın.
Bu seçeneği yalnızca bu kural, geçerli olduğu tüm kurallar veya bu kategorideki (Bakım) tüm kurallar için yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.
Devralma dışlanan tür veya ad alanı adları
Kuralı, devralma hiyerarşi ağacından belirli türleri veya ad alanlarını dışlamak üzere yapılandırabilirsiniz. Varsayılan olarak, ad alanından System.*
tüm türler dışlanır. Hangi değeri ayarlarsanız ayarlayın, bu varsayılan değer eklenir.
Seçenek Değeri | Özet |
---|---|
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType |
Ad alanını içeren MyType veya adlı MyType tüm türleri (ve ad alanından gelen tüm türleriSystem ) eşleştirir |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 |
Ad alanı içeren veya MyType1 (ve ad alanından tüm türler) içeren MyType2 ya da MyType1 adlı MyType2 tüm türleri System eşleştirir |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType |
Ad alanında belirli bir türle MyType (ve ad alanından NS tüm türlerde System ) eşleşir |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 |
Belirli türleri MyType1 ve MyType2 ilgili tam adlarla (ve ad alanından tüm türlerle) eşleştirir System |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS |
Ad alanından NS tüm türleri (ve ad alanından gelen tüm türleri) eşleştirir System |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* |
Adı ile My başlayan veya içeren ad alanı bölümleri ile My başlayan tüm türleri (ve ad alanından gelen tüm türleri System ) eşleştirir |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* |
Ad alanında adı ile My başlayan tüm türleri (ve ad NS alanından gelen tüm türleri) eşleştirir System |
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* |
Ad alanı içeren tüm türleri (ve ad alanından gelen tüm türleriMy ) ile System eşleştirir |
Örnek
Aşağıdaki örnekte kuralı ihlal eden bir tür gösterilmektedir:
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