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