Partilhar via


CA1062: Validar os argumentos de métodos públicos

TypeName

ValidateArgumentsOfPublicMethods

CheckId

CA1062

<strong>Categoria</strong>

Microsoft.design

Alteração significativa

Não separável

Causa

Cancela a um método visível externamente referência um dos seus argumentos de referência sem verificar se esse argumento é null (Nothing em Visual Basic).

Descrição da regra

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

Se um método pode ser chamado de um assembly desconhecido porque está declarado como público ou protegido, você deve validar todos os parâmetros do método. Se o método foi projetado para ser chamado somente por assemblies conhecidos, você deve fazer com que o método interno e aplicar o InternalsVisibleToAttribute atributo para 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 contra null.

Quando suprimir avisos

Se você tiver certeza de que o parâmetro dereferenced foi validado por outra chamada de método na função, você pode suprimir um aviso da regra.

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 detectar que os parâmetros estão sendo passados para o outro método que realiza 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");
}

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

No exemplo a seguir Person exemplo de classe, o other o objeto que é passado para o Person Construtor de cópia 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)
    {
    }
}

A seguir revisado Person exemplo, o other objeto que é passado para o construtor de cópia é verificado primeiro nulo na PassThroughNonNull método.

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