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 9 | 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:
- System.Collections.Immutable.ImmutableArray<T>
- System.Collections.Immutable.ImmutableList<T>
- System.Collections.Immutable.ImmutableHashSet<T>
- System.Collections.Immutable.ImmutableSortedSet<T>
- System.Collections.Immutable.ImmutableDictionary<TKey,TValue>
- System.Collections.Immutable.ImmutableSortedDictionary<TKey,TValue>
Te typy definiują metody rozszerzeń, które tworzą nową niezmienną kolekcję z istniejącej IEnumerable<T> kolekcji.
- ImmutableArray<T> definiuje element ToImmutableArray.
- ImmutableList<T> definiuje element ToImmutableList.
- ImmutableHashSet<T> definiuje element ToImmutableHashSet.
- ImmutableSortedSet<T> definiuje element ToImmutableSortedSet.
- ImmutableDictionary<TKey,TValue> definiuje element ToImmutableDictionary.
- ImmutableSortedDictionary<TKey,TValue> definiuje element ToImmutableSortedDictionary.
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 Ctrl+. (kropka). Wybierz pozycję Usuń nadmiarowe wywołanie z listy przedstawionych opcji.
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.