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


CA1868: ненужный вызов "Contains" для наборов

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

Причина

ICollection<T>.Remove Вызов ISet<T>.Add или охраняется вызовомContains. Или вызов IImmutableSet<T>.AddIImmutableSet<T>.Remove охраняется вызовом IImmutableSet<T>.Contains.

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

Оба ISet<T>.Add(T) и ICollection<T>.Remove(T) выполнение подстановки, что делает его избыточным для вызова ICollection<T>.Contains(T) заранее. Более эффективно вызывать Add(T) или Remove(T) напрямую, возвращая логическое значение, указывающее, был ли добавлен или удален элемент.

Эта логика также применяется и, за исключением того, что они возвращают новый набор, если элемент добавляется или удаляется IImmutableSet<T>.Add(T)IImmutableSet<T>.Remove(T), или исходный набор, если он не был.

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

Замените вызов (илиIImmutableSet<T>.Contains(T)), за которым следует вызов ISet<T>.Add(T)ICollection<T>.Contains(T) или ICollection<T>.Remove(T) (илиIImmutableSet<T>.Add(T)) IImmutableSet<T>.Remove(T)одним вызовом последнего метода.

Пример

В следующем фрагменте кода показано нарушение CA1868:

void Run(ISet<string> set)
{
    if (!set.Contains("Hello World"))
    {
        set.Add("Hello World");
    }
}
Sub Run(set As ISet(Of String))
    If Not set.Contains("Hello World") Then
        set.Add("Hello World")
    End If
End Sub

Следующий фрагмент кода исправляет нарушение.

void Run(ISet<string> set)
{
    set.Add("Hello World");
}
Sub Run(set As ISet(Of String))
    set.Add("Hello World")
End Sub

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

Это предупреждение безопасно подавлять, если производительность не является проблемой.

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

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

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

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

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

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