다음을 통해 공유


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

속성
규칙 ID CA1062
제목 public 메서드의 인수에 대한 유효성을 검사하세요.
범주 디자인
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 아니요

원인

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

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

규칙 설명

외부에 표시되는 메서드에 전달되는 모든 참조 인수는 null인지를 검사해야 합니다. 적절한 경우 인수가 있는 경우 throw ArgumentNullException 합니다 null.

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 표면에서만 실행되도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.api_surface = private, internal

참고 항목

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

특정 기호 제외

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

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

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

  • 기호 이름만(포함하는 형식 또는 네임스페이스와 관계없이 해당 이름의 모든 기호 포함).
  • 기호의 설명서 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를 개별 정규화된 시그니처와 비교합니다.

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

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

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

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

  • 형식 이름만(포함하는 형식이나 네임스페이스와 관계없이 해당 이름의 모든 형식 포함)
  • 기호의 설명서 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 매개 변수를 분석하고 플래그 지정합니다. 프로젝트의 editorconfig 파일에 다음 키-값 쌍을 추가하여 확장 메서드 this 매개 변수 분석을 제외할 수 있습니다.

dotnet_code_quality.CA1062.exclude_extension_method_this_parameter = true

Null 검사 유효성 검사 메서드

코드가 참조된 라이브러리나 프로젝트에서 특수한 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 컴파일에서 Validate2 명명된 Validate1 모든 메서드와 일치합니다.
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 클래스 예제에서 Person 복사 생성자에 전달되는 other 개체는 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;
    }
}