مشاركة عبر


ملحق Microsoft Office 2010 Suite قواعد إرشاد تعليمات برمجية تحليل تصميم مجموعة القاعدة توسيع قواعد إرشاد تصميم

TypeName

ValidateArgumentsOfPublicMethods

CheckId

ca1062

Category

Microsoft.تصميم

تعطيل تغيير

غير فاصلة

السبب

طريقة مرئي خارجياً deمرجعs واحد من به مرجع الوسائط دون التحقق ما إذا كانت هذه وسيطة null(Nothingفي Visual أساسى).

وصف القاعدة

محدد من الجميع الوسيطات مرجع التي تم تمريرها إلى وظائف مرئي خارجياً وجود مقابل null. إذا كان ذلك مناسباً، رمى ArgumentNullExceptionعند هو وسيطة null.

إذا كان يمكن استدعاء أسلوب من تجميع غير معروف لأنه تم تعريفه عامة أو محمية، فيجب عليك التحقق من صحة الجميع معلمات الأسلوب. إذا كان الأسلوب هو مصمم ليتم استدعاؤها بتجميعات المعروفة فقط، قمت يجب جعل الأسلوب الداخلية وتطبيق InternalsVisibleToAttributeالسمة إلى تجميع الذي يحتوي على الأسلوب.

كيف إلى الإصلاح انتهاكات

إلى إصلاحه انتهاكا لهذه قاعدة، قم بالتحقق من صحة كل وسيطة مرجع مقابل null.

عند إلى منع التحذيرات

يمكنك إيقاف تحذير من هذه قاعدة إذا كنت متأكداً من أن معلمة dereferenced تم التحقق من صحة قبل استدعاء أسلوب آخر في دالة.

مثال

يوضح المثال التالي طريقة تخالف قاعدة و أسلوب الذي يفي بالقاعدة.

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

يمكن أيضا المنشئات نسخ ملء الحقل أو الخصائص التي الكائنات مرجعية تخالف قاعدة CA1062. الخرق تحدث بسبب المنسوخ كائن يتم تمريره إلى النسخ الدالة الإنشائية قد null(Nothingفي Visual أساسى). لحل الانتهاك، استخدم أسلوب ثابت (مشتركة في Vهوual أساسي) للتحقق من التي الكائن المنسوخ هو غير فارغة.

في ما يلي Personالمثال الفئة، otherالكائن الذي هو التي تم تمريرها إلى Personقد تكون النسخة الدالة الإنشائية 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)
    {
    }
}

في revهوed التالية Personالمثال، otherالكائن الذي هو التي تم تمريرها إلى المنشئ نسخ هو أولاً التحقق من قيمة خالية في 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;
    }
}