Partager via


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