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 Kolaylığı
Düzeltme bozucu ya da bozmayan olabilir Son Dakika
Varsayılan eşik 5
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Neden

Tür, devralma hiyerarşisinde beş veya daha fazla düzey derinliğindedir.

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 System ad alanındaki türleri hariç tutar. Kuralı diğer türleri veya ad alanlarını da dışlamak için yapılandırabilirsiniz.
  • Bu kuralın tetikleneceğ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 geriye dönük uyumsuzluklara yol açabilir. Örneğin, genel erişimli 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 büyük bir değişiklikten kaynaklanmaktadır. 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ır

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şi içinde sekiz veya daha fazla düzey derin olduğunda tetiklenecek ş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>
    

Kod çözümleme için konfigüre et

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.

Devralmaya dahil edilmeyen 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 İsmi MyType olan veya ad alanı MyType içeren tüm türleri (ve System ad alanındaki tüm türleri) eşleştirir.
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 İsimleri MyType1 veya MyType2 olan ya da bulundukları ad alanları MyType1 veya MyType2 içeren (ve System ad alanındaki tüm türleri kapsayan) tüm türleri eşleştirir.
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType MyType ad alanındaki belirli türü (ve System ad alanındaki tüm türleri) eşleştirir
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 Belirli türleri MyType1 ve MyType2, ilgili tam nitelikli adlarıyla (ve System ad alanındaki tüm türlerle) eşleştirir.
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS NS ad alanındaki tüm türleri (ve System ad alanındaki tüm türleri) eşleştirir
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* Adı My ile başlayan veya dahil olduğu ad alanı bölümleri My ile başlayan tüm türleri (ve System ad alanından gelen tüm türleri) eşleştirir.
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* Ad alanı My ile başlayan tüm türleri (ve System ad alanından gelen tüm türleri) eşleştirir.
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* My ile başlayan ad alanına sahip tüm türleri (ve System ad alanındaki tüm türleri) 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