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


CA2009: не вызывайте ToImmutableCollection на значении ImmutableCollection

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

Причина

Метод 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+. (точка). В списке выберите Удалить избыточный вызов.

Исправление кода для правила CA2009: не вызывайте метод ToImmutableCollection для элемента ImmutableCollection

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

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

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

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

#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

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

См. также