CA1062 : Valider les arguments de méthodes publiques
TypeName |
ValidateArgumentsOfPublicMethods |
CheckId |
CA1062 |
Catégorie |
Microsoft.CSharp |
Modification avec rupture |
Modification sans rupture |
Cause
Une méthode visible de l'extérieur déréférence l'un de ses arguments de référence sans vérifier si cet argument a la valeur null (Nothing en Visual Basic).
Description de la règle
Tous les arguments de référence passés aux méthodes visibles de l'extérieur doivent être vérifiés pour voir s'ils ont la valeur null. Si besoin, levez une exception ArgumentNullException lorsque l'argument a la valeur null.
Si une méthode peut être appelée à partir d'un assembly inconnu car il est déclaré public ou protégé, vous devez valider tous les paramètres de la méthode. Si la méthode est conçue pour être appelée uniquement par les assemblys connus, vous devez rendre la méthode interne et appliquer l'attribut InternalsVisibleToAttribute à l'assembly qui contient la méthode.
Comment corriger les violations
Pour corriger une violation de cette règle, validez chaque argument de référence par rapport à null.
Quand supprimer les avertissements
Vous pouvez supprimer un avertissement de cette règle si vous êtes certain que le paramètre déréférencé a été validé par un autre appel de méthode dans la fonction.
Exemple
L'exemple suivant présente une méthode qui viole la règle et une autre qui satisfait à la règle.
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);
}
}
}
}
Dans Visual Studio 2005, cette règle ne détecte pas les paramètres qui sont passés à une autre méthode qui fait la validation.
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");
}
Les constructeurs de copie qui remplissent u champ ou des propriétés qui sont des objets de référence peuvent également violer la règle CA1062. La violation se produit parce que l'objet copié passé au constructeur de copie peut être null (Nothing en Visual Basic). Pour résoudre la violation, utilisez une méthode statique (méthode partagée en Visual Basic) pour vérifier que l'objet copié n'est pas null.
Dans l'exemple de classe Person suivant, l'objet other passé au constructeur de copie Person peut être 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)
{
}
}
Dans l'exemple modifié Person suivant, l'objet other passé au constructeur de copie est vérifié en premier pour null dans la méthode 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;
}
}