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

プロパティ
ルール ID CA1062
Title パブリック メソッドの引数の検証
[カテゴリ] デザイン
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 いいえ

原因

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

特定の型およびパラメーターが分析から除外されるように、この規則を構成することができます。 また、null チェック検証メソッドを指定することもできます。

規則の説明

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

public または protected と宣言されているために不明なアセンブリからメソッドを呼び出すことができる場合は、メソッドのすべてのパラメーターを検証する必要があります。 メソッドが既知のアセンブリによってのみ呼び出されるように設計されている場合は、メソッドを internal とマークし、メソッドが含まれるアセンブリに InternalsVisibleToAttribute 属性を適用します。

違反の修正方法

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

どのようなときに警告を抑制するか

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

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA1062
// The code that's violating the rule is on this line.
#pragma warning restore CA1062

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA1062.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。

分析するコードを構成する

次のオプションを使用して、コードベースのどの部分に対してこの規則を実行するかを構成します。

これらのオプションを構成できる対象は、この規則だけ、それを適用するすべての規則、それを適用するこのカテゴリ (デザイン) のすべての規則のいずれかです。 詳細については、「コード品質規則の構成オプション」を参照してください。

特定の API サーフェイスを含める

ユーザー補助に基づいて、この規則を実行するコードベースの部分を構成できます。 たとえば、非パブリック API サーフェイスでのみ規則を実行するように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CAXXXX.api_surface = private, internal

Note

このオプションは、.NET 7 以降のバージョンの CA1062 でのみサポートされます。

特定のシンボルを除外する

型やメソッドなど、特定のシンボルを分析から除外することができます。 たとえば、MyType という名前の型のコードで規則を実行しないように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

オプションの値で使用できるシンボル名の形式 (| で区切ります):

  • シンボル名のみ (包含する型または名前空間に関係なく、その名前が指定されたすべてのシンボルが含まれます)。
  • そのシンボルのドキュメント ID 形式の完全修飾名。 各シンボル名には、メソッドには M:、型には T:、名前空間には N: のように、シンボルの種類のプレフィックスが必要です。
  • コンストラクターには .ctor、静的コンストラクターには .cctor

例 :

オプション値 まとめ
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType MyType という名前のすべてのシンボルを検索します。
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 MyType1 または MyType2 という名前のすべてのシンボルを検索します。
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) 指定された完全修飾シグネチャを持つ特定のメソッド MyMethod を検索します。
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) それぞれの完全修飾シグネチャを持つ特定のメソッド MyMethod1 または MyMethod2 を検索します。

特定の型とその派生型を除外する

分析から特定の型とその派生型を除外できます。 たとえば、MyType という名前の型のメソッドとその派生型で規則を実行しないように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

オプションの値で使用できるシンボル名の形式 (| で区切ります):

  • 型の名前のみ (包含する型または名前空間に関係なく、その名前が指定されたすべての型が含まれます)。
  • そのシンボルのドキュメント ID 形式の完全修飾名 (オプションで T: プレフィックスも使用可)。

例 :

オプション値 まとめ
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType MyType という名前のすべての型と、そのすべての派生型を検索します。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 MyType1 または MyType2 という名前のすべての型と、そのすべての派生型を検索します。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType 指定された完全修飾名を持つ特定の型 MyType と、そのすべての派生型を検索します。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 それぞれの完全修飾名を持つ特定の型 MyType1 または MyType2 と、そのすべての派生型を検索します。

拡張メソッドの "this" パラメーターを除外する

既定では、この規則により、拡張メソッドの this パラメーターが分析されて、フラグが設定されます。 プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加することで、拡張メソッドの this パラメーターの分析を除外できます。

dotnet_code_quality.CA1062.exclude_extension_method_this_parameter = true

null チェック検証メソッド

参照されているライブラリまたはプロジェクト内の特別な null チェック検証メソッドがコードで呼び出されている場合、この規則は擬陽性になることがあります。 null チェック検証メソッドの名前またはシグネチャを指定することで、これらの擬陽性を回避できます。 分析では、これらのメソッドに渡された引数が、呼び出しの後で null でないものと想定されています。 たとえば、Validate という名前のすべてのメソッドを null チェック検証メソッドとしてマークするには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CA1062.null_check_validation_methods = Validate

オプションの値で使用できるメソッド名の形式 (| で区切ります):

  • メソッド名のみ (包含する型または名前空間に関係なく、その名前が指定されたすべてのメソッドが含まれます)。
  • そのシンボルのドキュメント ID 形式の完全修飾名 (オプションで M: プレフィックスも使用可)。

例 :

オプション値 まとめ
dotnet_code_quality.CA1062.null_check_validation_methods = Validate コンパイル時に、Validate という名前が付けられたすべてのメソッドを照合します。
dotnet_code_quality.CA1062.null_check_validation_methods = Validate1|Validate2 コンパイル時に、Validate1 または Validate2 のいずれかの名前が付けられたすべてのメソッドを照合します。
dotnet_code_quality.CA1062.null_check_validation_methods = NS.MyType.Validate(ParamType) 指定された完全修飾シグネチャを持つ特定の Validate メソッドを照合します。
dotnet_code_quality.CA1062.null_check_validation_methods = NS1.MyType1.Validate1(ParamType)|NS2.MyType2.Validate2(ParamType) それぞれ完全修飾シグネチャを持つ特定の Validate1 および Validate2 メソッドを照合します。

例 1

次に示すのは、規則に違反するメソッドと、規則を満たすメソッドの例です。

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(nameof(input));
            }
            if (input.Length != 0)
            {
                Console.WriteLine(input);
            }
        }
    }
}
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(NameOf(input))
            End If

            If input.Length <> 0 Then
                Console.WriteLine(input)
            End If

        End Sub

    End Class

End Namespace

例 2

参照オブジェクトであるフィールドまたはプロパティを設定するコピー コンストラクターも、規則 CA1062 に違反することがあります。 コピー コンストラクターに渡されるコピーされたオブジェクトが null (Visual Basic ではNothing) である可能性があるため、違反が発生します。 違反を解決するには、static (Visual Basic では Shared) メソッドを使用して、コピーされたオブジェクトが 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)
    {
    }
}

例 3

次の修正された Person の例では、コピー コンストラクターに渡される other オブジェクトは、最初に PassThroughNonNull メソッドで 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
    public Person(Person other)
        : this(PassThroughNonNull(other).Name, other.Age)
    {
    }

    // Null check method
    private static Person PassThroughNonNull(Person person)
    {
        if (person == null)
            throw new ArgumentNullException(nameof(person));
        return person;
    }
}