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 8'de 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 noneolarak 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.

  1. CodeMetricsConfig.txt adlı bir metin dosyası oluşturun.

  2. İ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.

  3. 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 MyType2 (ve ad alanından tüm türler) içeren MyType1 ya da MyType2 adlı MyType1 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ürleriSystem) ile My 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