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 9 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
HRESULT
oder 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();
}
}