CA1806: не игнорируйте результаты метода
Свойство | Значение |
---|---|
Идентификатор правила | CA1806 |
Заголовок | Не игнорируйте результаты метода |
Категория | Производительность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | Как предложение |
Причина
Существует несколько возможных причин для этого предупреждения:
- Новый объект создается, но не используется.
- Вызывается метод, создающий и возвращающий новую строку, и новая строка не используется.
- Метод 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();
}
}