Condividi tramite


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