CA1806: Methodenergebnisse nicht ignorieren.

Eigenschaft Wert
Regel-ID CA1806
Titel Methodenergebnisse nicht ignorieren.
Kategorie Leistung
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Als Vorschlag

Ursache

Es gibt mehrere mögliche Gründe für diese Warnung:

  • Ein neues Objekt wird erstellt, aber nie verwendet.

  • Eine Methode, die eine neue Zeichenfolge erstellt und zurückgibt, wird aufgerufen, und die neue Zeichenfolge wird nie verwendet.

  • Eine COM- oder P/Invoke-Methode, die HRESULToder Fehlercode zurückgibt, der nicht verwendet wird.

  • Eine LINQ-Methode (Language Integrated Query), die ein Ergebnis zurückgibt, das nicht verwendet wird.

Regelbeschreibung

Unnötige Objekterstellung und zugeordnete Garbage Collection des nicht verwendeten Objekts setzen die Leistungsfähigkeit herab.

Zeichenfolgen sind unveränderlich, und Methoden wie String.ToUpper geben eine neue Instanz einer Zeichenfolge zurück, anstatt die Instanz der Zeichenfolge in der aufrufenden Methode zu ändern.

Das Ignorieren von HRESULT oder eines Fehlercodes kann zu Bedingungen mit geringen Ressourcen oder unerwartetem Verhalten unter Fehlerbedingungen führen.

LINQ-Methoden haben bekanntermaßen keine Nebeneffekte, und das Ergebnis sollte nicht ignoriert werden.

Behandeln von Verstößen

Wenn eine Methode eine neue Instanz eines Objekts erstellt, das nicht verwendet wird, übergeben Sie die Instanz als Argument an eine andere Methode, oder weisen Sie die Instanz einer Variablen zu. Wenn die Objekterstellung unnötig ist, entfernen Sie diese.

Oder

Wenn Methode A Methode B aufruft, jedoch nicht die neue Zeichenfolgeninstanz verwendet, die von Methode B zurückgegeben wird, übergeben Sie die Instanz als Argument an eine andere Methode, weisen Sie die Instanz einer Variablen zu. Oder entfernen Sie den Aufruf, sofern er unnötig ist.

Oder

Wenn Methode A Methode B aufruft, jedoch nicht den HRESULT oder Fehlercode verwendet, den die Methode zurückgibt, verwenden Sie das Ergebnis in einer Bedingungsanweisung, weisen Sie das Ergebnis einer Variablen zu, oder übergeben Sie es als Argument an eine andere Methode.

Oder

Wenn die LINQ-Methode A Methode B aufruft, jedoch nicht das Ergebnis verwendet, verwenden Sie das Ergebnis in einer Bedingungsanweisung, weisen Sie das Ergebnis einer Variablen zu, oder übergeben Sie es als Argument an eine andere Methode.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel, es sei denn, das Erstellen des Objekts dient einem bestimmten Zweck.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Konfigurieren des zu analysierenden Codes

Mithilfe der folgenden Option können Sie konfigurieren, für welche Teile Ihrer Codebasis diese Regel ausgeführt werden soll.

Zusätzliche zu erzwingende Methoden

Sie können diese Regel konfigurieren, um zu überprüfen, ob Ergebnisse von zusätzlichen benutzerdefinierten APIs verwendet werden. Geben Sie mindestens eine Methode als Wert der Option additional_use_results_methods an. Um mehrere Methodennamen anzugeben, trennen Sie sie durch |. Es folgen die zulässigen Formate für den Methodennamen:

  • Nur Methodenname (schließt alle Methoden mit diesem Namen unabhängig vom enthaltenden Typ oder Namespace ein).
  • Vollqualifizierter Name im Format für die Dokumentations-ID, mit dem optionalen Präfix M:.

Um beispielsweise anzugeben, dass die Regel CA1806 auch prüfen soll, ob das Ergebnis einer Methode namens MyMethod1 verwendet wird, fügen Sie das folgende Schlüssel-Wert-Paar zur Datei .editorconfig in Ihrem Projekt hinzu.

dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1

Oder verwenden Sie den vollqualifizierten Namen, um Eindeutigkeit zu gewährleisten oder sicherzustellen, dass nur eine bestimmte Methode mit diesem Namen enthalten ist.

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

Beispiel 1

Das folgende Beispiel zeigt eine Klasse, die das Ergebnis des Aufrufs von String.Trim ignoriert.

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

Beispiel 2

Im folgenden Beispiel wird der Verstoß in Beispiel 1 korrigiert, indem das Ergebnis von String.Trim der Variablen zugewiesen wird, für die der Aufruf erfolgt ist.

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

Beispiel 3

Das folgende Beispiel zeigt eine Methode, die kein Objekt verwendet, das sie erstellt.

Hinweis

Dieser Verstoß kann in Visual Basic nicht reproduziert werden.

public class Book
{
    public Book()
    {
    }

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

Beispiel 4

Im folgenden Beispiel wird der Verstoß in Beispiel 3 behoben, indem die unnötige Erstellung eines Objekts entfernt wird.

public class Book
{
    public Book()
    {
    }

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