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