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

Свойство Значение
Идентификатор правила CA1806
Заголовок Не игнорируйте результаты метода
Категория Производительность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Существует несколько возможных причин для этого предупреждения:

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

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

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

  • Метод запроса, интегрированный с языком (LINQ), который возвращает результат, который никогда не использовался.

Описание правила

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

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

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

Известно, что методы LINQ не имеют побочных эффектов и результат должен учитываться.

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

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

–или–

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

–или–

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

–или–

Если метод LINQ A вызывает метод B, но не использует результат, используйте результат в условной инструкции, назначьте результат переменной или передайте его в качестве аргумента другому методу.

Когда лучше отключить предупреждения

Не скрывайте предупреждений по этому правилу, если только процесс создания объекта не служит определенной цели.

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

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA1806
// The code that's violating the rule is on this line.
#pragma warning restore CA1806

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA1806.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Настройка кода для анализа

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

Дополнительные методы для принудительного применения

Это правило можно настроить для проверка, которые приводят к использованию дополнительных пользовательских API. Укажите один или несколько методов в качестве значенияadditional_use_results_methods параметра. Чтобы указать несколько имен методов, разделите их с |помощью . Допустимые форматы для имени метода:

  • Только имя метода (которое будет включать все методы с таким именем, независимо от их содержащего типа или пространства имен).
  • Полное имя в формате идентификатора документации с необязательным M: префиксом.

Например, чтобы указать, что правило CA1806 также должно проверка, что используется результат именованного MyMethod1 метода, добавьте следующую пару "ключ-значение" в файл editorconfig в проекте.

dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1

Или используйте полное имя для диамбигуации или убедитесь, что включен только определенный метод с таким именем.

dotnet_code_quality.CA1806.additional_use_results_methods = M:MyNamespace.MyType.MyMethod1(ParamType)

Пример 1

В следующем примере показан класс, который игнорирует результат вызова 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

Пример 2

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

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

Пример 3

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

Примечание.

Это нарушение не может быть воспроизведено в Visual Basic.

public class Book
{
    public Book()
    {
    }

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

Пример 4

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

public class Book
{
    public Book()
    {
    }

    public static Book CreateBook()
    {
        return new Book();
    }
}