次の方法で共有


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

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

原因

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

  • 新しいオブジェクトが作成されましたが、使用されませんでした。
  • 新しい文字列を作成して返すメソッドが呼び出され、新しい文字列が使用されていません。
  • COM または P/Invoke メソッドは、使用されていない HRESULT またはエラー コードを返します。
  • 言語統合クエリ (LINQ) メソッドは、決して使用されていない結果を返します。
  • [Pure] メソッドが呼び出され、戻り値は使用されません。

規則の説明

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

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

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

PureAttributeで注釈付けされた LINQ メソッドとメソッドには副作用がないことがわかっているので、結果を無視しないでください。

違反の修正方法

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

\- または -

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

\- または -

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

\- または -

メソッド A が LINQ または純粋メソッド 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
{
    public Book(string title)
    {
        // Violates this rule.
        title?.Trim();

        Title = title;
    }

    public string? Title { get; }
}
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

次の例では、 String.Trim の結果を呼び出された変数に割り当てることで違反を修正します。

public class Book
{
    public Book(string title)
    {
        // Fixes the violation.
        Title = title?.Trim();
    }

    public string? Title { get; }
}
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

例 2

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

注意

この違反は Visual Basic では再現できません。

public class Book
{
    public Book() { }

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

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

public class Book
{
    public Book() { }

    public static Book CreateBook()
    {
        // Fixes the violation.
        return new Book();
    }
}