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