Compartir a través de


CA1806: No omitir resultados del método

Nombre de tipo

DoNotIgnoreMethodResults

Identificador de comprobación

CA1806

Categoría

Microsoft.Usage

Cambio problemático

No

Causa

Hay varios motivos posibles para esta advertencia.

  • Se creó un objeto nuevo pero nunca se utilizó.

  • Se llama a un método que crea y devuelve una cadena nueva y la nueva cadena nunca se utiliza.

  • Un método COM o P/Invoke devuelve un código de error o HRESULT que nunca se utiliza. Descripción de la regla

La creación innecesaria de objetos y la recolección de elementos no utilizados asociada al objeto no utilizado reducen el rendimiento.

Las cadenas son inmutables y 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 un código de error o HRESULT puede producir un comportamiento inesperado en situaciones de error o de escasez de recursos.

Cómo corregir infracciones

Si el método A crea una nueva instancia del objeto B que nunca se utiliza, pase la instancia como argumento a otro método o asigne la instancia a una variable. Si la creación del objeto no es necesaria, quítela. -O bien-

Si el método A llama al método B pero no utiliza la nueva instancia de la cadena devuelta por el método B, pase la instancia como argumento a otro método, asigne la instancia a una variable o quite la llamada si no es necesaria.

O bien

Si el método A llama al método B pero no utiliza el código de error o HRESULT devuelto por el método B, utilice 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 advertencias

No suprima ninguna advertencia de esta regla a menos que la creación del objeto sirva para algún propósito.

Ejemplo

En el ejemplo siguiente se muestra una clase que omite el resultado de la llamada a String.Trim.

En el ejemplo siguiente se corrige la infracción anterior asignando de nuevo el resultado de String.Trim a la variable en la que se realizó la llamada.

En el ejemplo siguiente se muestra un método que no utiliza ningún objeto de los que crea.

Nota

Esta infracción no puede reproducirse en Visual Basic.

Imports System

Namespace Samples

    Public Class Book

        Private ReadOnly _Title As String

        Public Sub New(ByVal title As String)

            If title IsNot Nothing Then
                ' Violates this rule                
                title.Trim()
            End If

            _Title = title

        End Sub

        Public ReadOnly Property Title() As String
            Get
                Return _Title
            End Get
        End Property

    End Class

End Namespace
using System;

namespace Samples
{
    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; }
        }
    }
}
using namespace System;

namespace Samples
{
    public ref class Book   
    { 
        private:        
            initonly String^ _Title;

        public:
        Book(String^ title)        
        {               
            if (title != nullptr)            
            {                  
                // Violates this rule                
                title->Trim();            
            }
                _Title = title;        
            }

        property String^ Title        
        {            
            String^ get() { return _Title; }        
        }    
    };
}

En el ejemplo siguiente se corrige la infracción anterior quitando la creación innecesaria de un objeto.

Imports System

Namespace Samples

    Public Class Book

        Private ReadOnly _Title As String

        Public Sub New(ByVal title As String)

            If title IsNot Nothing Then
                title = title.Trim()
            End If

            _Title = title

        End Sub

        Public ReadOnly Property Title() As String
            Get
                Return _Title
            End Get
        End Property

    End Class

End Namespace
using System;

namespace Samples
{
    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; }
        }
    }
}
using namespace System;

namespace Samples
{    
    public ref class Book    
    {    
    private:        
        initonly String^ _Title;

    public:
        Book(String^ title)        
        {               
            if (title != nullptr)            
            {                        
                title = title->Trim();            
            }

            _Title = title;        
        }

        property String^ Title        
        {            
            String^ get() { return _Title; }        
        }    
    };
}

En el ejemplo siguiente se muestra un método que omite el código de error que el método nativo GetShortPathName devuelve.

using System;

namespace Samples
{
    public class Book
    {
        public Book()
        {
        }

        public static Book CreateBook()
        {
            // Violates this rule            
            new Book();
            return new Book();
        }
    }
}
using namespace System;

namespace Samples
{    
    public ref class Book    
    {
    public:
        Book()        
        {        
        }

        static Book^ CreateBook()        
        {
            // Violates this rule            
            gcnew Book();            
            return gcnew Book();        
        }    
    };
}

En el ejemplo siguiente se corrige la infracción anterior comprobando el código de error e iniciando una excepción si la llamada no se realiza correctamente.

using System;

namespace Samples
{
    public class Book
    {
        public Book()
        {
        }

        public static Book CreateBook()
        {
            return new Book();
        }
    }
}
using namespace System;

namespace Samples
{
    public ref class Book    
    {
    public:
        Book()        
        {           
        }
        static Book^ CreateBook()        
        {            
            return gcnew Book();        
        }            
    };
}