Visual Studio 2017 を使用することをお勧めします

CA1062: パブリック メソッドの引数の検証

 

公開日: 2016年6月

Visual Studio 2017 RC の最新のドキュメントの詳細については、Visual Studio 2017 RC ドキュメントをご参照ください。

TypeNameValidateArgumentsOfPublicMethods
CheckIdCA1062
分類Microsoft.Design
互換性に影響する変更点なし

引数が null (Visual Basic では Nothing) であるかどうかを確認せずに、外部から参照可能なメソッドが参照引数の 1 つを逆参照しています。

外部から参照可能なメソッドに渡されるすべての参照引数について、null かどうかをチェックする必要があります。 引数が null の場合、ArgumentNullException をスローします。

メソッドがパブリックまたはプロテクトとして宣言されているために、未知のアセンブリから呼び出すことができる場合は、そのメソッドのすべてのパラメーターを検証する必要があります。 メソッドが既知のアセンブリからのみ呼び出すことができるよう設計されている場合は、そのメソッドを内部メソッドとして設定し、そのメソッドを含むアセンブリに InternalsVisibleToAttribute 属性を適用する必要があります。

この規則違反を修正するには、各参照引数が null かどうかを検証します。

逆参照されるパラメーターが、関数の別のメソッド呼び出しによって検証されていることが確実な場合は、この規則からの警告を表示しないようにすることができます。

この規則に違反しているメソッドと、規則に適合するメソッドを次の例に示します。

Visual Studio 2005 では、検証を行う別のメソッドにパラメーターが渡されるかどうかを、この規則で検出できませんでした。

参照オブジェクトであるフィールドまたはプロパティを設定するコピー コンストラクターを実行すると、CA1064 規則に違反する可能性があります。 この違反が発生するのは、コピー コンストラクターに渡されるコピーされたオブジェクトが null (Visual Basic では Nothing) である可能性があるためです。 この違反を解決するには、静的 (Visual Basic では共有) メソッドを使用して、コピーされたオブジェクトが null でないことを確認します。

次の Person クラスの例では、Person コピー コンストラクターに渡される other オブジェクトが 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)  
    {  
    }  
}  
  

次の Person の修正例では、コピー コンストラクターに渡される other オブジェクトが null であるかどうかが、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;  
    }  
}  
  

表示: