Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1868 |
| Заголовок | Ненужный вызов 'Contains' для множеств |
| Категория | Производительность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Как предложение |
| Применимые языки | C# и Visual Basic |
Причина
Вызов ISet<T>.Add или ICollection<T>.Remove охраняется вызовом Contains. Или вызов IImmutableSet<T>.Add или IImmutableSet<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), за исключением того, что они возвращают новый набор, если элемент добавляется или удаляется, или исходный набор, если нет.
Устранение нарушений
Замените вызов ICollection<T>.Contains(T) (или IImmutableSet<T>.Contains(T)), за которым следует вызов ISet<T>.Add(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
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.