다음을 통해 공유


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;
    }
}