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 apenas por assemblies conhecidos, faça o método interno e aplicar o InternalsVisibleToAttribute de 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 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);
            }
        }
    }
}

Na Visual Studio 2005, esta regra não detecta que os parâmetros estão sendo passados para o 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");
}

Construtores de cópia que preencher o campo ou propriedades 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 o método 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 o 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;
    }
}