Compartilhar via


CA1806: Não ignorar resultados do método

Property Valor
ID da regra CA1806
Título Não ignorar resultados do método
Categoria Desempenho
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

Há vários motivos possíveis para esse aviso:

  • Um novo objeto é criado, mas nunca usado.

  • Um método que criar e retorna uma nova cadeia de caracteres é chamado e a nova cadeia de caracteres nunca é usada.

  • Um método COM ou P/Invoke que retorna um código HRESULT ou erro que nunca é usado.

  • Um método LINQ (consulta integrada à linguagem) que retorna um resultado que nunca é usado.

Descrição da regra

A criação de objeto desnecessário e a coleta de lixo associada do objeto não utilizado degradam o desempenho.

Cadeias de caracteres são imutáveis e métodos como String.ToUpper retornam uma nova instância de uma cadeia de caracteres em vez de modificar a instância da cadeia de caracteres no método de chamada.

Ignorar HRESULT ou um código de erro pode levar a condições de baixo recurso ou comportamento inesperado em condições de erro.

Os métodos LINQ são conhecidos por não ter efeitos colaterais e o resultado não deve ser ignorado.

Como corrigir violações

Se um método criar uma nova instância de um objeto que nunca é usado, passe a instância como um argumento para outro método ou atribua a instância a uma variável. Se a criação do objeto for desnecessária, remova-a.

-ou-

Se o método A chama o método B, mas não usa a nova instância de cadeia de caracteres que o método B retorna, passe a instância como um argumento para outro método ou atribua a instância a uma variável. Ou então, remova a chamada se for desnecessária.

-ou-

Se o método A chamar o método B, mas não usa o HRESULT ou o código de erro que o método retorna, use o resultado em uma instrução condicional, atribua o resultado a uma variável ou passe-o como argumento para outro método.

-ou-

Se um método A de LINQ chamar o método B, mas não usa o resultado, use o resultado em uma instrução condicional, atribua o resultado a uma variável ou passe-o como argumento para outro método.

Quando suprimir avisos

Não suprime um aviso dessa regra, a menos que o ato de criar o objeto atenda a alguma finalidade.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

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

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

Para obter mais informações, confira Como suprimir avisos de análise de código.

Configurar código para analisar

Use a opção a seguir para configurar em quais partes da base de código essa regra deve ser executada.

Métodos adicionais para imposição

Você pode configurar essa regra para verificar se os resultados de APIs personalizadas adicionais são usados. Especifique um ou mais métodos como o valor da opção additional_use_results_methods. Para especificar vários nomes de método, separe-os com |. Os formatos permitidos para o nome do método são:

  • Somente o nome do método (que incluirá todos os métodos com esse nome, independentemente do tipo ou namespace que o contém).
  • Nomes totalmente qualificados no formato de ID de documentação, com um prefixo M: opcional.

Por exemplo, para especificar essa regra CA1806, também é necessário verificar se o resultado de um método nomeado MyMethod1 é usado, adicione o par chave-valor a seguir a um arquivo .editorconfig em seu projeto.

dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1

Ou use o nome totalmente qualificado para desambiguar ou garantir que apenas um método específico com esse nome esteja incluído.

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

Exemplo 1

O exemplo a seguir mostra uma classe que ignora o resultado da chamada String.Trim.

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

Exemplo 2

O exemplo a seguir corrige a violação do de Exemplo 1, atribuindo o resultado String.Trim de volta à variável em que foi chamado.

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

Exemplo 3

O exemplo a seguir mostra um método que não usa um objeto que ele cria.

Observação

Essa violação não pode ser reproduzida no Visual Basic.

public class Book
{
    public Book()
    {
    }

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

Exemplo 4

O exemplo a seguir corrige a violação do Exemplo 3 removendo a criação desnecessária de um objeto.

public class Book
{
    public Book()
    {
    }

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