Поделиться через


CA1806: не игнорируйте результаты метода

TypeName

DoNotIgnoreMethodResults

CheckId

CA1806

Категория

Microsoft.Usage

Критическое изменение

Не критическое

Причина

Это предупреждение может возникать по нескольким причинам.

  • Создается новый объект, который нигде не используется.

  • Вызывается метод, который создает и возвращает новую строку, однако эта строка нигде не используется.

  • Метод COM или P/Invoke возвращает значение HRESULT или код ошибки, который никогда не используется.Описание правила

Ненужное создание объекта и связанная с ним сборка мусора для неиспользуемого объекта понижает производительность.

Строки невозможно изменить, и такие методы как String.ToUpper возвращают новый экземпляр строки, а не изменяют экземпляр строки в вызывающем методе.

Игнорирование HRESULT или кода ошибки может привести к непредвиденному поведению в состоянии ошибки или к нехватке ресурсов.

Устранение нарушений

Если метод А создает новый экземпляр объекта В, который никогда не используется, передайте этот экземпляр в качестве аргумента другому методу или присвойте экземпляр переменной.Если не требуется создавать объект, удалите его; или

Если метод A вызывает метод B, но не использует новый экземпляр строки, возвращаемый методом B.Передайте этот экземпляр другому методу в качестве аргумента, присвойте экземпляр переменной.Или удалите вызов, если он не нужен.

– или –

Если метод A вызывает метод B, но не использует значение HRESULT или код ошибки, возвращаемый методом B.Используйте результат в условном операторе, присвойте его переменной или передайте его в качестве аргумента другому методу.

Отключение предупреждений

Предупреждения о нарушении данного правила можно отключить только в том случае, если создание объекта необходимо для какой-либо цели.

Пример

В следующем примере показан класс, игнорирующий результат вызова метода String.Trim.

В следующем примере предыдущее нарушение устраняется присвоением результата метода String.Trim переменной, для которой он вызывался.

В следующем примере показан метод, который не использует создаваемый им объект.

ПримечаниеПримечание

Это нарушение нельзя воспроизвести в 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; }        
        }    
    };
}

В следующем примере предыдущее нарушение устраняется посредством удаления ненужного создания объекта.

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

В следующем примере показан метод, игнорирующий код ошибки, который возвращается собственным методом GetShortPathName.

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

В следующем примере предыдущее нарушение устраняется посредством проверки кода ошибки и создания исключения при сбое вызова.

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