Udostępnij za pośrednictwem


CA1062 Walidacja argumentów metod publicznych

TypeName

ValidateArgumentsOfPublicMethods

CheckId

CA1062

Kategoria

Microsoft.Design

Zmiana kluczowa

Niekluczowa

Przyczyna

Metoda widoczna na zewnątrz wykonuje dereferencji jednego z jej argumentów bez sprawdzenia, czy argument ma wartość null (Nothing w języku Visual Basic).

Opis reguły

Wszystkie argumenty odwołania, które są przekazywane do metody widocznej z zewnątrz powinny być sprawdzane czy nie mają wartości null.Jeśli jest to właściwe, należy zgłosić ArgumentNullException, gdy argument jest null.

Jeśli metoda może być wywołana z nieznanego zestawu, ponieważ jest zadeklarowana jako publiczna lub chroniona, należy sprawdzić wszystkie parametry metody.Jeśli metoda jest zaprojektowana, aby być wywoływana tylko przez znane zestawy, należy stworzyć metodę wewnętrzną i zastosować atrybut InternalsVisibleToAttribute do zestawu, który zawiera metodę.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, sprawdź poprawność każdego argumentu odwołania przeciwko null.

Kiedy pominąć ostrzeżenia

Ostrzeżenie od tej reguły można pominąć, jeśli masz pewność, że parametr poddawany dereferencji został sprawdzony przez inne wywołanie metody w funkcji.

Przykład

Poniższy przykład pokazuje metodę, która narusza regułę oraz metodę, która spełnia regułę.

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

W Visual Studio 2005, ta reguła nie wykrywa parametrów, które są przekazywane do innej metody, która sprawdza poprawność.

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

Konstruktory kopiujące, które wypełniają pole lub właściwości, które są obiektami odwołania mogą także naruszać regułę CA1062.Naruszenie występuje, ponieważ skopiowany obiekt, który jest przekazywany do konstruktora kopiującego może być null (Nothing w języku Visual Basic).Aby rozwiązać naruszenie, użyj metody statycznej (Shared w języku Visual Basic), aby sprawdzić czy kopiowany obiekt nie jest null.

W następującym przykładzie klasy Person obiekt other, który jest przekazywany do konstruktora kopiującego Person może być 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)
    {
    }
}

W następującym poprawionym przykładzie Person, obiekt other, który jest przekazywany do konstruktora kopiującego jest najpierw sprawdzany, czy jest null, w metodzie 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;
    }
}