CA2009: не вызывайте ToImmutableCollection в неизменяемом значенииCollection

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

Причина

Метод ToImmutable был без необходимости вызван для неизменяемой коллекции из пространства имен System.Collections.Immutable.

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

Пространство имен System.Collections.Immutable содержит типы, определяющие неизменяемые коллекции. Это правило анализирует следующие типы неизменяемых коллекций:

Эти типы определяют методы расширения, которые создают новую неизменяемую коллекцию из существующей коллекции IEnumerable<T>.

Эти методы расширения предназначены для преобразования изменяемой коллекции в неизменяемую. Однако вызывающий объект может случайно передать эти методам неизменяемую коллекцию в качестве входных данных. В результате могут возникнуть проблемы с производительностью и (или) функционалом.

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

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

Чтобы устранить нарушения, удалите избыточный вызов ToImmutable для неизменяемой коллекции. В следующих двух фрагментах кода показано нарушение правила и способы его устранения:

using System;
using System.Collections.Generic;
using System.Collections.Immutable;

public class C
{
    public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
    {
        // This is fine.
        M2(collection.ToImmutableArray());

        // This leads to CA2009.
        M2(immutableArray.ToImmutableArray());
    }

    private void M2(ImmutableArray<int> immutableArray)
    {
        Console.WriteLine(immutableArray.Length);
    }
}
using System;
using System.Collections.Generic;
using System.Collections.Immutable;

public class C
{
    public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
    {
        // This is fine.
        M2(collection.ToImmutableArray());

        // This is now fine.
        M2(immutableArray);
    }

    private void M2(ImmutableArray<int> immutableArray)
    {
        Console.WriteLine(immutableArray.Length);
    }
}

Совет

Для этого правила в Visual Studio доступно исправление кода. Чтобы использовать его, поместите курсор на нарушение и нажмите клавиши CTRL+ (период). В списке выберите Удалить избыточный вызов.

Code fix for CA2009 - Do not call ToImmutableCollection on an ImmutableCollection value

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

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

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

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

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

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

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

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

См. также