CA1806: No omitir resultados del método
Propiedad | Value |
---|---|
Identificador de la regla | CA1806 |
Título | No omitir resultados del método |
Categoría | Rendimiento |
La corrección es problemática o no problemática | Poco problemático |
Habilitado de forma predeterminada en .NET 8 | Como sugerencia |
Causa
Hay varias razones posibles por las que puede producirse esta advertencia:
Se crea un nuevo objeto, pero nunca se usa.
Se llama a un método que crea y devuelve una nueva cadena y la nueva cadena nunca se utiliza.
Un método COM o P/Invoke que devuelve
HRESULT
o un código de error que nunca se usa.Un método de Language Integrated Query (LINQ) que devuelve un resultado que nunca se usa.
Descripción de la regla
La creación de objetos innecesarios y la recolección de elementos no utilizados asociada del objeto no usado degradan el rendimiento.
Las cadenas son inmutables, y los métodos como String.ToUpper devuelven una nueva instancia de una cadena en lugar de modificar la instancia de la cadena en el método de llamada.
La omisión de HRESULT
o un código de error puede dar lugar situaciones de pocos recursos o a un comportamiento inesperado en condiciones de error.
Se sabe que los métodos LINQ no tienen efectos secundarios y que el resultado no debe ignorarse.
Cómo corregir infracciones
Si un método crea una nueva instancia de un objeto que nunca se usa, pase la instancia como argumento a otro método o asígnela a una variable. Si la creación del objeto es innecesaria, quítela.
O bien
Si el método A llama al método B pero no usa la nueva instancia de cadena que devuelve el método B, pase la instancia como argumento a otro método o asígnela a una variable. O bien quite la llamada si no es necesaria.
O bien
Si el método A llama al método B pero no usa HRESULT
o el código de error que devuelve el método, use el resultado de una instrucción condicional, asigne el resultado a una variable o páselo como argumento a otro método.
O bien
Si un método LINQ A llama al método B pero no usa el resultado, emplee el resultado de una instrucción condicional, asigne el resultado a una variable o páselo como argumento a otro método.
Cuándo suprimir las advertencias
No suprima una advertencia de esta regla a menos que exista algún motivo para crear el objeto.
Supresión de una advertencia
Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.
#pragma warning disable CA1806
// The code that's violating the rule is on this line.
#pragma warning restore CA1806
Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none
del archivo de configuración.
[*.{cs,vb}]
dotnet_diagnostic.CA1806.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.
Configuración del código para analizar
Use la opción siguiente para configurar en qué partes del código base ejecutar esta regla.
Métodos adicionales que aplicar
Puede configurar esta regla para comprobar que se usen los resultados de las API personalizadas adicionales. Especifique uno o varios métodos como valor de la opción additional_use_results_methods
. Para especificar varios nombres de métodos, sepárelos con |
. Los formatos permitidos para los nombres de métodos son:
- Solo el nombre del método (lo que incluye todos los métodos con ese nombre, con independencia del tipo contenedor o el espacio de nombres).
- Nombre completo en el formato de identificador de documentación, con un prefijo
M:
opcional.
Por ejemplo, para especificar que la regla CA1806 también debe comprobar que se use el resultado de un método de nombreMyMethod1
, agregue el siguiente par clave-valor a un archivo .editorconfig del proyecto.
dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1
O bien, use el nombre completo para eliminar la ambigüedad o asegurarse de que solo se incluya un método específico con ese nombre.
dotnet_code_quality.CA1806.additional_use_results_methods = M:MyNamespace.MyType.MyMethod1(ParamType)
Ejemplo 1
En el ejemplo siguiente se muestra una clase que omite el resultado de la llamada a 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
Ejemplo 2
En el ejemplo siguiente se corrige la infracción del ejemplo 1 mediante la asignación del resultado de String.Trim de nuevo a la variable en la que se llamó.
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
Ejemplo 3
En el ejemplo siguiente se muestra un método que no utiliza un objeto que crea.
Nota
Esta infracción no se puede reproducir en Visual Basic.
public class Book
{
public Book()
{
}
public static Book CreateBook()
{
// Violates this rule
new Book();
return new Book();
}
}
Ejemplo 4
En el ejemplo siguiente se corrige la infracción del ejemplo 3 mediante la cancelación de la creación innecesaria de un objeto.
public class Book
{
public Book()
{
}
public static Book CreateBook()
{
return new Book();
}
}