CA1806: Non ignorare i risultati dei metodi
Proprietà | valore |
---|---|
ID regola | CA1806 |
Title | Non ignorare i risultati dei metodi |
Categoria | Prestazioni |
Correzione che causa un'interruzione o un'interruzione | Nessuna interruzione |
Abilitato per impostazione predefinita in .NET 8 | Come suggerimento |
Causa
Esistono diversi motivi possibili per questo avviso:
Viene creato un nuovo oggetto ma non viene mai usato.
Viene chiamato un metodo che crea e restituisce una nuova stringa e la nuova stringa non viene mai usata.
Metodo COM o P/Invoke che restituisce un
HRESULT
codice di errore o che non viene mai usato.Metodo LINQ (Language Integrated Query) che restituisce un risultato mai usato.
Descrizione regola
La creazione di oggetti non necessari e l'operazione di Garbage Collection associata dell'oggetto inutilizzato riducono le prestazioni.
Le stringhe sono non modificabili e metodi come String.ToUpper restituiscono una nuova istanza di una stringa anziché modificare l'istanza della stringa nel metodo chiamante.
Ignorare HRESULT
o un codice di errore può causare condizioni di risorse basse o un comportamento imprevisto in condizioni di errore.
I metodi LINQ non hanno effetti collaterali e il risultato non deve essere ignorato.
Come correggere le violazioni
Se un metodo crea una nuova istanza di un oggetto che non viene mai usato, passare l'istanza come argomento a un altro metodo o assegnare l'istanza a una variabile. Se la creazione dell'oggetto non è necessaria, rimuoverla.
-o-
Se il metodo A chiama il metodo B ma non usa la nuova istanza stringa restituita dal metodo B, passare l'istanza come argomento a un altro metodo o assegnare l'istanza a una variabile. In alternativa, rimuovere la chiamata se non è necessaria.
-o-
Se il metodo A chiama il metodo B ma non usa il HRESULT
codice di errore o restituito dal metodo, utilizzare il risultato in un'istruzione condizionale, assegnare il risultato a una variabile o passarlo come argomento a un altro metodo.
-o-
Se un metodo LINQ A chiama il metodo B ma non usa il risultato, usare il risultato in un'istruzione condizionale, assegnare il risultato a una variabile o passarlo come argomento a un altro metodo.
Quando eliminare gli avvisi
Non eliminare un avviso da questa regola a meno che l'azione di creazione dell'oggetto non funga da qualche scopo.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA1806
// The code that's violating the rule is on this line.
#pragma warning restore CA1806
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none
su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA1806.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.
Configurare il codice da analizzare
Usare l'opzione seguente per configurare le parti della codebase in cui eseguire questa regola.
Metodi aggiuntivi da applicare
È possibile configurare questa regola per verificare che vengano usati i risultati di API personalizzate aggiuntive. Specificare uno o più metodi come valore dell'opzione additional_use_results_methods
. Per specificare più nomi di metodo, separarli con |
. I formati consentiti per il nome del metodo sono:
- Solo nome del metodo (che includerà tutti i metodi con tale nome, indipendentemente dal tipo o dallo spazio dei nomi contenitore).
- Nome completo nel formato ID della documentazione, con un prefisso facoltativo
M:
.
Ad esempio, per specificare che la regola CA1806 deve anche verificare che il risultato di un metodo denominato MyMethod1
venga usato, aggiungere la coppia chiave-valore seguente a un file con estensione editorconfig nel progetto.
dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1
In alternativa, usare il nome completo per disambiguare o assicurarsi che sia incluso solo un metodo specifico con tale nome.
dotnet_code_quality.CA1806.additional_use_results_methods = M:MyNamespace.MyType.MyMethod1(ParamType)
Esempio 1
Nell'esempio seguente viene illustrata una classe che ignora il risultato della chiamata String.Trima .
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
Esempio 2
Nell'esempio seguente viene risolta la violazione dell'esempio 1 assegnando di nuovo il risultato alla String.Trim variabile su cui è stato chiamato.
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
Esempio 3
Nell'esempio seguente viene illustrato un metodo che non usa un oggetto creato.
Nota
Questa violazione non può essere riprodotta in Visual Basic.
public class Book
{
public Book()
{
}
public static Book CreateBook()
{
// Violates this rule
new Book();
return new Book();
}
}
Esempio 4
Nell'esempio seguente viene corretta la violazione dell'esempio 3 rimuovendo la creazione non necessaria di un oggetto .
public class Book
{
public Book()
{
}
public static Book CreateBook()
{
return new Book();
}
}