次の方法で共有


CA1806:メソッドの結果を無視しない

プロパティ
ルール ID CA1806
Title メソッドの結果を無視しない
[カテゴリ] パフォーマンス
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

この警告の原因はいくつかあります。

  • 新しいオブジェクトが作成されましたが、使用されませんでした。

  • 新しい文字列を作成して返すメソッドが呼び出され、新しい文字列が使用されていません。

  • 使用されない HRESULT またはエラー コードを返す COM メソッドまたは P/Invoke メソッド。

  • 使用されない結果を返す統合言語クエリ (LINQ) メソッド。

規則の説明

不要なオブジェクトの作成と、使用されないオブジェクトに関連するガベージ コレクションにより、パフォーマンスが低下します。

文字列は不変であり、String.ToUpper などのメソッドは、呼び出し元のメソッド内の文字列のインスタンスを変更するのではなく、文字列の新しいインスタンスを返します。

HRESULT またはエラー コードを無視すると、リソース不足の状態やエラー状態で予期しない動作が発生する可能性があります。

LINQ メソッドは副作用がないことがわかっているため、結果を無視するべきではありません。

違反の修正方法

メソッドが使用されないオブジェクトの新しいインスタンスを作成する場合は、インスタンスを引数として別のメソッドに渡すか、変数にインスタンスを代入します。 オブジェクトの作成が不要な場合は、これを削除します。

\- または -

メソッド A がメソッド B を呼び出すにもかかわらず、メソッド B から返される新しい文字列インスタンスを使用しない場合は、インスタンスを引数として他のメソッドに渡すか、変数にインスタンスを代入します。 または、不要な場合には呼び出しを削除します。

または

メソッド A がメソッド B を呼び出すにもかかわらず、メソッドから返される HRESULT またはエラー コードを使用しない場合は、条件ステートメントで結果を使用するか、変数に結果を代入するか、引数として他のメソッドに渡します。

または

LINQ メソッド A がメソッド B を呼び出すにもかかわらず、結果を使用しない場合は、条件ステートメントで結果を使用するか、変数に結果を代入するか、引数として他のメソッドに渡します。

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

オブジェクトを作成する操作によって何らかの目的がある場合を除き、この規則による警告を抑制しないでください。

警告を抑制する

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

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

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

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

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

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

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

適用する追加のメソッド

この規則を構成して、追加のカスタム API からの結果が使用されていることを確認できます。 additional_use_results_methods オプションの '''' として 1 つまたは複数のメソッドを指定します。 複数のメソッド名を指定するには、それらを | で区切ります。 メソッド名で許可される形式は次のとおりです。

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

たとえば、規則 CA1806 で MyMethod1 という名前のメソッドからの結果が使用されていることも確認する必要があることを指定するには、次のキーと値のペアをプロジェクトの .editorconfig ファイルに追加します。

dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1

または、完全修飾名を使用してあいまいさを解消するか、その名前を持つ特定のメソッドのみが含まれていることを確めます。

dotnet_code_quality.CA1806.additional_use_results_methods = M:MyNamespace.MyType.MyMethod1(ParamType)

例 1

次の例は、String.Trim の呼び出し結果を無視するクラスを示しています。

public class Book
{
    private readonly string? _Title;

    public Book(string title)
    {
        if (title != null)
        {
            // Violates this rule
            title.Trim();
        }

        _Title = title;
    }

    public string? Title
    {
        get { return _Title; }
    }
}
Public Class Book
    Public Sub New(ByVal title As String)

        If title IsNot Nothing Then
            ' Violates this rule                
            title.Trim()
        End If

        Me.Title = title

    End Sub

    Public ReadOnly Property Title() As String

End Class

例 2

次の例では、呼び出し元の変数に String.Trim の結果を代入することで、例 1 の違反を修正しました。

public class Book
{
    private readonly string? _Title;

    public Book(string title)
    {
        if (title != null)
        {
            title = title.Trim();
        }

        _Title = title;
    }

    public string? Title
    {
        get { return _Title; }
    }
}
Public Class Book
    Public Sub New(ByVal title As String)

        If title IsNot Nothing Then
            title = title.Trim()
        End If

        Me.Title = title

    End Sub

    Public ReadOnly Property Title() As String

End Class

例 3

次の例は、作成したオブジェクトを使用しないメソッドを示しています。

注意

Visual Basic でこの違反を再現することはできません。

public class Book
{
    public Book()
    {
    }

    public static Book CreateBook()
    {
        // Violates this rule
        new Book();
        return new Book();
    }
}

例 4

次の例では、不要なオブジェクトの作成を削除することによって、例 3 の違反を修正します。

public class Book
{
    public Book()
    {
    }

    public static Book CreateBook()
    {
        return new Book();
    }
}