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) |
특정 메서드 MyMethod1 및 MyMethod2 를 개별 정규화된 시그니처와 비교합니다. |
특정 형식 및 해당 파생 형식 제외
분석에서 특정 형식과 해당 파생 형식을 제외할 수 있습니다. 예를 들어 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) |
특정 메서드 Validate1 와 Validate2 각 정규화된 서명과 일치합니다. |
예 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;
}
}
.NET