Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| 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:
- 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ć 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.
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.