다음을 통해 공유


CA1501: 상속성을 너무 많이 사용하지 마십시오.

속성
규칙 ID CA1501
타이틀 상속성을 너무 많이 사용하지 마세요.
범주 유지 관리
수정 사항이 주요 변경인지 여부 주요 변경
기본 임계값 5
.NET 8에서 기본적으로 사용 아니요

원인

형식은 상속 계층 구조에서 5개 이상의 수준입니다.

규칙 설명

여러 번 중첩된 형식 계층 구조는 추적하고, 이해하고, 유지 관리하기가 어렵습니다. 이 규칙은 동일한 모듈의 계층 구조로 분석을 제한합니다.

다음 방법으로 이 규칙을 구성할 수 있습니다.

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 상속 계층 구조에서 수준이 낮은 기본 형식에서 형식을 파생하거나 중간 기본 형식 중 일부를 제거합니다.

경고를 표시하지 않는 경우

이 규칙의 경고를 표시하지 않아도 됩니다. 그러나 코드를 유지 관리하기가 더 어려울 수 있습니다. 기본 형식의 표시 유형에 따라 이 규칙 위반을 해결하면 호환성이 손상되는 변경이 발생할 수 있습니다. 예를 들어 퍼블릭 기본 형식 제거는 호환성이 손상되는 변경입니다.

참고 항목

다음이 모두 적용되는 경우 이 규칙에서 가양성 경고가 표시될 수 있습니다.

  • Visual Studio 2022 버전 17.5 이상을 이전 버전의 .NET SDK(.NET 6 이하)와 함께 사용하고 있습니다.
  • .NET 6 SDK 분석기 또는 이전 버전의 분석기 패키지(예: Microsoft.CodeAnalysis.FxCopAnalyzers)를 사용하고 있습니다.

가양성은 C# 컴파일러의 호환성이 손상되는 변경으로 인해 발생합니다. 가양성 경고에 대한 수정 사항이 포함된 최신 분석기를 사용하는 것이 좋습니다. Microsoft.CodeAnalysis.NetAnalyzers 버전 7.0.0-preview1.22464.1 이상으로 업그레이드하거나 .NET 7 SDK에서 분석기를 사용하세요.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA1501
// The code that's violating the rule is on this line.
#pragma warning restore CA1501

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA1501.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

임계값 구성

이 규칙이 실행되는 임계값을 구성할 수 있습니다.

  1. CodeMetricsConfig.txt 텍스트 파일을 만듭니다.

  2. 텍스트 파일에 원하는 임계값을 다음 형식으로 추가합니다.

    CA1501: 8
    

    이 예제에서는 상속 계층 구조에서 형식이 8개 이상의 수준인 경우 규칙이 실행되도록 구성됩니다.

  3. 프로젝트 파일에서 구성 파일의 빌드 동작을 AdditionalFiles로 표시합니다. 예시:

    <ItemGroup>
      <AdditionalFiles Include="CodeMetricsConfig.txt" />
    </ItemGroup>
    

분석할 코드 구성

다음 옵션을 사용하여 이 규칙이 실행될 코드베이스 부분을 구성합니다.

이 규칙, 적용되는 모든 규칙 또는 적용되는 이 범주의 모든 규칙(유지 관리 기능)에 대해 이 옵션을 구성할 수 있습니다. 자세한 내용은 코드 품질 규칙 구성 옵션을 참조하세요.

상속 제외 형식 또는 네임스페이스 이름

상속 계층 구조 트리에서 특정 형식이나 네임스페이스를 제외하도록 규칙을 구성할 수 있습니다. 기본적으로 System.* 네임스페이스의 모든 형식이 제외됩니다. 설정하는 값과 관계없이 이 기본값이 추가됩니다.

옵션 값 요약
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType MyType이라는 모든 형식 또는 포함하는 네임스페이스에 MyType이 포함된 모든 형식(및 System 네임스페이스의 모든 형식) 일치
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = MyType1|MyType2 MyType1 또는 MyType2라는 모든 형식, 포함하는 네임스페이스에 MyType1 또는 MyType2가 포함된 모든 형식(및 System 네임스페이스의 모든 형식) 일치
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.MyType NS 네임스페이스의 특정 MyType 형식(및 System 네임스페이스의 모든 형식) 일치
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS1.MyType1|T:NS2.MyType2 특정 형식 MyType1MyType2를 해당 정규화된 이름(및 System 네임스페이스의 모든 형식)과 일치
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:NS NS 네임스페이스의 모든 형식(및 System 네임스페이스의 모든 형식) 일치
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = My* 이름이 My로 시작하거나 포함하는 네임스페이스 파트가 My로 시작하는 모든 형식(및 System 네임스페이스의 모든 형식) 일치
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = T:NS.My* NS 네임스페이스에서 이름이 My로 시작하는 모든 형식(및 System 네임스페이스의 모든 형식) 일치
dotnet_code_quality.CA1501.additional_inheritance_excluded_symbol_names = N:My* 포함하는 네임스페이스가 My로 시작하는 모든 형식(및 System 네임스페이스의 모든 형식) 일치

예시

다음 예제에서는 규칙을 위반하는 형식을 보여 줍니다.

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