Проверьте аргументы открытых методов
Обновлен: Ноябрь 2007
TypeName |
ValidateArgumentsOfPublicMethods |
CheckId |
CA1062 |
Категория |
Microsoft.Design |
Критическое изменение |
Не критическое |
Причина
Видимый для внешнего кода методы выполняет разыменование одного из своих ссылочных аргументов, не проверяя его на равенство со значением null (Nothing в Visual Basic).
Описание правила
Все ссылочные аргументы, передаваемые в видимые для внешнего кода методы, должны проверяться на равенство со значением null. Если это возможно, при равенстве аргумента значению null следует вызывать исключение System.ArgumentNullException.
Предотвращение нарушений
Чтобы устранить нарушение данного правила, проверьте каждый ссылочный аргумент на равенство значению null.
Отключение предупреждений
Не следует отключать вывод предупреждений для этого правила.
Пример
В следующем примере показан метод, который нарушает данное правило, и метод, удовлетворяющий ему.
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
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);
}
}
}
}
В Visual Studio 2005 имеется несколько ограничений данного правила. Одно ограничение заключается в том, что
правило не определяет ситуацию, когда параметры передаются другому методу, в котором производится такая проверка.
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 string Method(string value)
{
EnsureNotNull(value);
// Fires incorrectly
return value.ToString();
}
private void EnsureNotNull(string value)
{
if (value == null)
throw new ArgumentNullException("value");
}
Другое ограничение состоит в том, что правило не учитывает операторы сокращенных вычислений.
Public Function Method(ByVal value1 As String, ByVal value2 As String) As String
If value1 Is Nothing OrElse value2 Is Nothing Then
Throw New ArgumentNullException()
End If
' Fires incorrectly
Return value1.ToString() + value2.ToString()
End Function
public string Method(string value1, string value2)
{
if (value1 == null || value2 == null)
throw new ArgumentNullException(value1 == null ? "value1" : "value2");
// Fires incorrectly
return value1.ToString() + value2.ToString();
}