CA1062: public 메서드의 인수의 유효성을 검사하십시오.
TypeName |
ValidateArgumentsOfPublicMethods |
CheckId |
CA1062 |
범주 |
Microsoft.Design |
변경 수준 |
주요 변경 아님 |
원인
외부에서 볼 수 있는 메서드에서 해당 인수가 null(Visual Basic의 경우 Nothing)인지 여부를 확인하지 않고 참조 인수 중 하나를 역참조합니다.
규칙 설명
외부에서 볼 수 있는 메서드에 전달되는 모든 참조 인수는 null인지 여부를 검사해야 합니다. 적절한 경우 인수가 null이면 ArgumentNullException을 throw합니다.
공용 또는 보호로 선언되기 때문에 알 수 없는 어셈블리에서 메서드를 호출할 수 있는 경우 메서드의 모든 매개 변수의 유효성을 검사해야 합니다. 메서드가 알려진 어셈블리로만 호출하도록 디자인된 경우 내부 메서드를 만들고 이 모델이 들어 있는 어셈블리에 InternalsVisibleToAttribute 특성을 적용해야 합니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 각 참조 인수가 null인지 확인합니다.
경고를 표시하지 않는 경우
역참조된 매개 변수가 함수에 있는 다른 메서드 호출에 의해 확인된 경우 이 규칙에서 경고를 표시하지 않을 수 있습니다.
예제
다음 예제에서는 이 규칙을 위반하는 메서드와 규칙을 충족하는 메서드를 보여 줍니다.
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("input")
End If
If input.Length <> 0 Then
Console.WriteLine(input)
End If
End Sub
End Class
End Namespace
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)
{
}
}
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("input");
}
if (input.Length != 0)
{
Console.WriteLine(input);
}
}
}
}
Visual Studio 2005에서 이 규칙은 유효성을 검사하는 다른 메서드로 매개 변수가 전달되는 경우를 감지할 수 없습니다.
Public Function Method(ByVal value As String) As String
EnsureNotNull(value)
' Fires incorrectly
Return value.ToString()
End Function
Private Sub EnsureNotNull(ByVal value As String)
If value Is Nothing Then
Throw (New ArgumentNullException("value"))
End If
End Sub
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,
PassThroughNonNull(other).Age)
{
}
// Null check method
private static Person PassThroughNonNull(Person person)
{
if (person == null)
throw new ArgumentNullException("person");
return person;
}
}
public string Method(string value)
{
EnsureNotNull(value);
// Fires incorrectly
return value.ToString();
}
private void EnsureNotNull(string value)
{
if (value == null)
throw new ArgumentNullException("value");
}
개체를 참조하는 필드 또는 속성을 채우는 복사 생성자는 CA1062 규칙을 위반할 수 있습니다. 복사 생성자에 전달되는 복사된 개체가 null(Visual Basic에서는 Nothing)이 될 수 있기 때문에 위반이 발생합니다. 위반 문제를 해결하려면 정적(Visual Basic에서는 공유) 메서드를 사용하여 복사된 개체가 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)
{
}
}
다음 수정된 Person 예제에서 복사 생성자에 전달되는 PassThroughNonNull 메서드에서 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
public Person(Person other)
: this(PassThroughNonNull(other).Name,
PassThroughNonNull(other).Age)
{
}
// Null check method
private static Person PassThroughNonNull(Person person)
{
if (person == null)
throw new ArgumentNullException("person");
return person;
}
}