Compartilhar via


CA1062: validar argumentos de métodos públicos

TypeName

ValidateArgumentsOfPublicMethods

CheckId

CA1062

Categoria

Microsoft.Design

Alteração Significativa

Sem Quebra

Causa

Um método externamente visível cancelará um de seus argumentos de referência sem verificar se esse argumento é null (Nothing no Visual Basic).

Descrição da Regra

Todos os argumentos de referência que são passados para os métodos externamente visíveis devem ser verificados em null.Se apropriado, lance ArgumentNullException quando o argumento é null.

Se um método pode ser chamado de um assembly desconhecido porque é declarado público ou protegido, você deve validar todos os parâmetros do método.Se o método é criado para ser chamado somente pelos assemblies conhecidos, você deve fazer o método interno e aplique o atributo de InternalsVisibleToAttribute o assembly que contém o método.

Como Corrigir Violações

Para corrigir uma violação desta regra, validar cada argumento de referência em null.

Quando Suprimir Alertas

Você pode suprimir um aviso dessa regra se você tiver certeza de que o parâmetro cancelado esteve validado por outra chamada do método na função.

Exemplo

O exemplo a seguir mostra um método que viola a regra e um método que satisfaça a regra.

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

Em Visual Studio 2005, esta regra não detecta que os parâmetros estão sendo passados a outro método que faz a validação.

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

Copie os construtores que populam o campo ou as propriedades que são objetos de referência também podem violar a regra CA1062.A violação ocorrer porque o objeto copiado transmitido ao construtor de cópia pode ser null (Nothing no Visual Basic).Para resolver a violação, use compartilhado (no Visual Basic) um método estático para verificar se o objeto copiado não é nulo.

No exemplo da classe de Person , o objeto de other transmitido ao construtor de cópia de Person pode ser 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)
    {
    }
}

No exemplo revisado de Person , o objeto de other transmitido ao construtor de impressão é verificado principalmente para verificar se há um valor nulo no método de PassThroughNonNull .

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