다음을 통해 공유


CA1062: public 메서드의 인수의 유효성을 검사하십시오.

속성
규칙 ID CA1062
제목 public 메서드의 인수에 대한 유효성을 검사하세요.
범주 디자인
수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 아니요
적용 가능한 언어 C# 및 Visual Basic

원인

외부에 표시되는 메서드는 해당 인수가 null(Visual Basic에서 Nothing)인지를 확인하지 않고 해당 참조 인수 중 하나를 역참조합니다.

해당 규칙을 분석에서 특정 형식 및 매개 변수를 제외하도록구성할 수 있습니다. Null 검사 검증 메서드를 나타낼 수도 있습니다.

규칙 설명

외부에 표시되는 메서드에 전달되는 모든 참조 인수는 null인지를 검사해야 합니다. 인수가 null일 때, 적절하다면 ArgumentNullException을 던집니다.

public 또는 protected로 선언되기 때문에 알 수 없는 어셈블리에서 메서드를 호출할 수 있는 경우 메서드의 모든 매개 변수에 대한 유효성을 검사해야 합니다. 메서드가 알려진 어셈블리로만 호출되도록 고안된 경우 메서드를 internal 표시하고 메서드를 포함하는 어셈블리에 InternalsVisibleToAttribute 특성을 적용합니다.

위반 문제를 해결하는 방법

해당 규칙 위반 문제를 해결하려면 null에 대해 각 참조 인수의 유효성을 검사합니다.

경고를 표시하지 않는 경우

역참조된 매개 변수 유효성을 함수의 다른 메서드 호출이 검사한 것으로 확인되는 경우는 해당 규칙에서 경고를 표시하지 않을 수 있습니다.

경고 표시 안 함

단일 위반을 억제하려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 후 다시 활성화하십시오.

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

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

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

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

분석할 코드 구성

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

또한 다음과 같은 다른 데이터 흐름 분석 관련 옵션이 이 규칙에 적용됩니다.

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

특정 API 화면 포함

api_surface 옵션을 설정하여 접근성에 따라 이 규칙을 실행할 코드베이스의 일부를 구성할 수 있습니다. 예를 들어 규칙이 퍼블릭이 아닌 API 표면에서만 실행되도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.api_surface = private, internal

주의

XXXX CAXXXX 부분을 해당 규칙의 ID로 바꿉니다.

주의

이 옵션은 .NET 7 이상 버전에서만 CA1062에 대해 지원됩니다.

특정 기호 제외

excluded_symbol_names 옵션을 설정하여 분석에서 형식 및 메서드와 같은 특정 기호를 제외할 수 있습니다. 예를 들어 MyType이라는 형식 내 코드에서 규칙을 실행하지 않도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

주의

XXXX CAXXXX 부분을 해당 규칙의 ID로 바꿉니다.

옵션 값의 허용되는 기호 이름 형식(|로 구분):

  • 기호 이름만(포함하는 형식 또는 네임스페이스와 관계없이 해당 이름의 모든 기호 포함).
  • 기호의 설명서 ID 형식에 있는 정규화된 이름. 각 기호 이름에는 메서드의 경우 M:, 형식의 경우 T:, 네임스페이스의 경우 N:과 같은 기호 종류 접두사가 필요합니다.
  • 생성자의 경우 .ctor이고 정적 생성자의 경우 .cctor입니다.

예:

옵션 값 요약
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType MyType이라는 모든 기호와 일치합니다.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 MyType1 또는 MyType2라는 모든 기호와 일치합니다.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) 특정 메서드 MyMethod를 지정된 정규화된 시그니처와 비교합니다.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) 특정 메서드 MyMethod1MyMethod2를 개별 정규화된 시그니처와 비교합니다.

특정 형식 및 해당 파생 형식 제외

excluded_type_names_with_derived_types 옵션을 설정하여 분석에서 특정 형식 및 해당 파생 형식을 제외할 수 있습니다. 예를 들어 MyType이라는 형식 및 해당 파생 형식 내에 있는 메서드에서 규칙이 실행되지 않도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

주의

XXXX CAXXXX 부분을 해당 규칙의 ID로 바꿉니다.

옵션 값의 허용되는 기호 이름 형식(|로 구분):

  • 형식 이름만(포함하는 형식이나 네임스페이스와 관계없이 해당 이름의 모든 형식 포함)
  • 기호의 설명서 ID 형식에 있는 정규화된 이름(선택적 T: 접두사 포함)

예:

옵션 값 요약
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType MyType이라는 모든 형식 및 모든 해당 파생 형식과 일치합니다.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 MyType1 또는 MyType2라는 모든 형식 및 모든 해당 파생 형식과 일치합니다.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType 지정된 정규화된 이름과 관련된 특정 MyType 형식 및 해당 모든 파생 형식과 일치합니다.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 MyType1, MyType2 특정 형식과 해당 파생 형식을 각 개별 정규화된 이름과 일치시킵니다.

확장 메서드 ‘this’ 매개 변수를 제외합니다.

기본적으로 해당 규칙은 확장 메서드 this 매개 변수를 분석하고 플래그 지정합니다. 프로젝트의 this 파일에 다음 키-값 쌍을 추가하여 확장 메서드 매개 변수 분석을 제외할 수 있습니다.

dotnet_code_quality.CA1062.exclude_extension_method_this_parameter = true

Null 값 확인 유효성 검사 메서드

코드가 참조된 라이브러리나 프로젝트에서 특수한 null 유효성 검사 메서드를 호출하는 경우, 이 규칙으로 인해 오탐이 발생할 수 있습니다. 널 확인 유효성 검사 메서드의 이름 또는 시그니처를 명시하여 오탐을 방지할 수 있습니다. 분석에서는 호출 후 메서드에 전달된 인수가 null이 아니라고 가정합니다. 예를 들어 모든 Validate 메서드를 null 검사 유효성 검사 메서드로 표시하려면 프로젝트의 editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CA1062.null_check_validation_methods = Validate

옵션 값의 허용되는 메서드 이름 형식(|로 구분):

  • 메서드 이름만(포함하는 형식 또는 네임스페이스와 관계없이 해당 이름의 모든 메서드 포함)
  • 기호의 설명서 ID 형식에 있는 정규화된 이름(선택적 M: 접두사 포함)

예:

옵션 값 요약
dotnet_code_quality.CA1062.null_check_validation_methods = Validate 컴파일에 명명된 Validate 모든 메서드와 일치합니다.
dotnet_code_quality.CA1062.null_check_validation_methods = Validate1|Validate2 컴파일 시 Validate1 또는 Validate2로 명명된 모든 메서드와 일치합니다.
dotnet_code_quality.CA1062.null_check_validation_methods = NS.MyType.Validate(ParamType) 지정된 완전히 정규화된 서명과 특정 메서드 Validate를 일치시킵니다.
dotnet_code_quality.CA1062.null_check_validation_methods = NS1.MyType1.Validate1(ParamType)|NS2.MyType2.Validate2(ParamType) 특정 메서드 Validate1Validate2 각 정규화된 서명과 일치합니다.

예 1

다음 예제에서는 규칙을 위반하는 메서드와 규칙을 충족하는 메서드를 보여 줍니다.

using System;

namespace DesignLibrary
{
    public class Test
    {
        // This method violates the rule.
        public void DoNotValidate(string input)
        {
            if (input.Length != 0)
            {
                Console.WriteLine(input);
            }
        }

        // This method satisfies the rule.
        public void Validate(string input)
        {
            if (input == null)
            {
                throw new ArgumentNullException(nameof(input));
            }
            if (input.Length != 0)
            {
                Console.WriteLine(input);
            }
        }
    }
}
Imports System

Namespace DesignLibrary

    Public Class Test

        ' This method violates the rule.
        Sub DoNotValidate(ByVal input As String)

            If input.Length <> 0 Then
                Console.WriteLine(input)
            End If

        End Sub

        ' This method satisfies the rule.
        Sub Validate(ByVal input As String)

            If input Is Nothing Then
                Throw New ArgumentNullException(NameOf(input))
            End If

            If input.Length <> 0 Then
                Console.WriteLine(input)
            End If

        End Sub

    End Class

End Namespace

예제 2

참조 개체인 필드 또는 속성을 채우는 복사 생성자는 규칙 CA1062를 위반할 수도 있습니다. 복사 생성자에 전달된 복사된 개체가 null(Visual Basic에서 Nothing)일 수 있기 때문에 위반이 발생합니다. 위반 문제를 해결하려면 static(Visual Basic에서 Shared) 메서드를 사용하여 복사한 개체가 null이 아닌지 확인합니다.

다음 Person 클래스 예제에서 other 복사 생성자에 전달되는 Person 개체는 null일 수 있습니다.

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    // Copy constructor CA1062 fires because other is dereferenced
    // without being checked for null
    public Person(Person other)
        : this(other.Name, other.Age)
    {
    }
}

예제 3

다음의 수정된 Person 예제에서는 복사 생성자에 전달된 other 개체가 먼저 PassThroughNonNull 메서드에서 null인지 확인합니다.

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    // Copy constructor
    public Person(Person other)
        : this(PassThroughNonNull(other).Name, other.Age)
    {
    }

    // Null check method
    private static Person PassThroughNonNull(Person person)
    {
        if (person == null)
            throw new ArgumentNullException(nameof(person));
        return person;
    }
}