CA2009: Nie należy wywoływać metody ToImmutableCollection na wartości ImmutableCollection

Właściwości Wartość
Identyfikator reguły CA2009
Tytuł Nie wywołuj elementu ToImmutableCollection dla wartości ImmutableCollection
Kategoria Niezawodność
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako sugestia

Przyczyna

ToImmutable metoda została niepotrzebnie wywołana w niezmiennej kolekcji z System.Collections.Immutable przestrzeni nazw.

Opis reguły

System.Collections.Immutable Przestrzeń nazw zawiera typy definiujące kolekcje niezmienne. Ta reguła analizuje następujące niezmienne typy kolekcji:

Te typy definiują metody rozszerzeń, które tworzą nową niezmienną kolekcję z istniejącej IEnumerable<T> kolekcji.

Te metody rozszerzenia są przeznaczone do konwertowania kolekcji modyfikowalnej na niezmienną kolekcję. Jednak obiekt wywołujący może przypadkowo przekazać niezmienną kolekcję jako dane wejściowe do tych metod. Może to reprezentować wydajność i/lub problem funkcjonalny.

  • Problem z wydajnością: Niepotrzebne boxing, rozpakowywanie i/lub typ środowiska uruchomieniowego sprawdza w niezmiennej kolekcji.
  • Potencjalny problem funkcjonalny: Obiekt wywołujący zakładał, że działa w kolekcji modyfikowalnej, gdy rzeczywiście miał niezmienną kolekcję.

Jak naprawić naruszenia

Aby naprawić naruszenia, usuń nadmiarowe ToImmutable wywołanie kolekcji niezmiennej. Na przykład następujące dwa fragmenty kodu pokazują naruszenie reguły i sposób ich naprawiania:

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);
    }
}

Napiwek

Poprawka kodu jest dostępna dla tej reguły w programie Visual Studio. Aby go użyć, umieść kursor na naruszeniu i naciśnij klawisze Ctrl+. (kropka). Wybierz pozycję Usuń nadmiarowe wywołanie z listy przedstawionych opcji.

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

Kiedy pomijać ostrzeżenia

Nie pomijaj naruszeń tej reguły, chyba że nie obawiasz się wpływu na wydajność z niepotrzebnych alokacji niezmiennych kolekcji.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Zobacz też