Partilhar via


CA1806: Não ignore os resultados do método

Property valor
ID da regra CA1806
Título Não ignore os resultados do método
Categoria Desempenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 9 Como sugestão

Motivo

Existem várias razões possíveis para este aviso:

  • Um novo objeto é criado, mas nunca usado.

  • Um método que cria 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 HRESULT código de erro ou que nunca é usado.

  • Um método de consulta integrada ao idioma (LINQ) que retorna um resultado que nunca é usado.

Descrição da regra

A criação desnecessária de objetos e a coleta de lixo associada ao objeto não utilizado degradam o desempenho.

As cadeias de caracteres são imutáveis e métodos como String.ToUpper retornar 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 ou um código de HRESULT erro pode levar a condições de poucos recursos ou comportamento inesperado em condições de erro.

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

Como corrigir violações

Se um método cria 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-o.

-or-

Se o método A chamar o método B, mas não usar 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 remova a chamada se for desnecessária.

-or-

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

-or-

Se um método LINQ A chama 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 um argumento para outro método.

Quando suprimir avisos

Não suprima um aviso desta regra, a menos que o ato de criar o objeto sirva a algum propósito.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

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

Configurar código para análise

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

Métodos adicionais para aplicar

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 additional_use_results_methods opção. Para especificar vários nomes de método, separe-os com |. Os formatos permitidos para o nome do método são:

  • Somente nome do método (que incluirá todos os métodos com esse nome, independentemente de seu tipo ou namespace que o contenha).
  • Nome totalmente qualificado no formato ID da documentação, com um prefixo opcionalM:.

Por exemplo, para especificar que a regra CA1806 também deve verificar se o resultado de um método nomeado MyMethod1 é usado, adicione o seguinte par chave-valor 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 seja 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 Exemplo 1 atribuindo o resultado de String.Trim volta à variável na qual ele 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.

Nota

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