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 8 | 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.
- ou -
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.
- ou -
Se o método A chama o método B, mas não usa o 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 HRESULT
como um argumento para outro método.
- ou -
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 para um arquivo, pasta ou projeto, defina sua severidade 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 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 opcional
M:
.
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();
}
}