Udostępnij za pośrednictwem


CA2009: Nie wywołuj metody ToImmutableCollection na wartości typu ImmutableCollection

Właściwości Wartość
Identyfikator reguły CA2009
Tytuł Nie wywołuj metody ToImmutableCollection na wartości ImmutableCollection
Kategoria Niezawodność
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Jako sugestia
Zastosowane języki C# i Visual Basic

Przyczyna

ToImmutable metoda została niepotrzebnie wywołana na 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ć kolekcję niezmienną jako dane wejściowe do tych metod. Może to reprezentować wydajność i/lub problem funkcjonalny.

  • Problem z wydajnością: Niepotrzebne opakowywanie, rozpakowywanie i/lub sprawdzanie typu w czasie wykonywania w niezmiennej kolekcji.
  • Potencjalny problem funkcjonalny: Wywołujący zakładał, że działa na kolekcji modyfikowalnej, kiedy w rzeczywistości 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);
    }
}

Wskazówka

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

Poprawka kodu dla CA2009 — nie należy wywoływać ToImmutableCollection na kolekcji typu ImmutableCollection

Kiedy pomijać ostrzeżenia

Nie należy tłumić naruszeń tej reguły, chyba że nie obawiasz się wpływu na wydajność z niepotrzebnego alokowania kolekcji niemutowalnych.

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ż