Бөлісу құралы:


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

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

Причина

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

  • Новый объект создается, но не используется.
  • Вызывается метод, создающий и возвращающий новую строку, и новая строка не используется.
  • Метод COM или P/Invoke возвращает HRESULT или код ошибки, который никогда не использовался.
  • Метод запроса, интегрированный с языком (LINQ), возвращает результат, который никогда не использовался.
  • [Pure] Метод вызывается, а возвращаемое значение никогда не используется.

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

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

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

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

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

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

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

–или–

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

–или–

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

–или–

Если метод A вызывает LINQ или чистый метод 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
{
    public Book(string title)
    {
        // Violates this rule.
        title?.Trim();

        Title = title;
    }

    public string? Title { get; }
}
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

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

public class Book
{
    public Book(string title)
    {
        // Fixes the violation.
        Title = title?.Trim();
    }

    public string? Title { get; }
}
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

Пример 2

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

Примечание.

Это нарушение нельзя воспроизвести в Visual Basic.

public class Book
{
    public Book() { }

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

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

public class Book
{
    public Book() { }

    public static Book CreateBook()
    {
        // Fixes the violation.
        return new Book();
    }
}