CA2009: Anropa inte ToImmutableCollection på ett ImmutableCollection-värde
Property | Värde |
---|---|
Regel-ID | CA2009 |
Title | Anropa inte ToImmutableCollection på ett ImmutableCollection-värde |
Kategori | Tillförlitlighet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Som förslag |
Orsak
ToImmutable
-metoden anropades i onödan för en oföränderlig samling från System.Collections.Immutable namnområdet.
Regelbeskrivning
System.Collections.Immutable namespace innehåller typer som definierar oföränderliga samlingar. Den här regeln analyserar följande oföränderliga samlingstyper:
- 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>
Dessa typer definierar tilläggsmetoder som skapar en ny oföränderlig samling från en befintlig IEnumerable<T> samling.
- ImmutableArray<T> definierar ToImmutableArray.
- ImmutableList<T> definierar ToImmutableList.
- ImmutableHashSet<T> definierar ToImmutableHashSet.
- ImmutableSortedSet<T> definierar ToImmutableSortedSet.
- ImmutableDictionary<TKey,TValue> definierar ToImmutableDictionary.
- ImmutableSortedDictionary<TKey,TValue> definierar ToImmutableSortedDictionary.
Dessa tilläggsmetoder är utformade för att konvertera en föränderlig samling till en oföränderlig samling. Anroparen kan dock oavsiktligt skicka in en oföränderlig samling som indata till dessa metoder. Detta kan representera ett prestanda- och/eller funktionsproblem.
- Prestandaproblem: Onödiga boxnings-, avboxnings- och/eller körningstypkontroller på en oföränderlig samling.
- Potentiellt funktionsproblem: Anroparen antas fungera på en föränderlig samling när den faktiskt hade en oföränderlig samling.
Så här åtgärdar du överträdelser
Åtgärda överträdelser genom att ta bort det redundanta ToImmutable
anropet för en oföränderlig samling. Följande två kodfragment visar till exempel ett brott mot regeln och hur du åtgärdar dem:
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);
}
}
Dricks
En kodkorrigering är tillgänglig för den här regeln i Visual Studio. Om du vill använda den placerar du markören på överträdelsen och trycker på Ctrl+. (punkt). Välj Ta bort redundant anrop i listan över alternativ som visas.
När du ska ignorera varningar
Förhindra inte överträdelser från den här regeln, såvida du inte bryr dig om prestandapåverkan från onödiga allokeringar av oföränderliga samlingar.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2009
// The code that's violating the rule is on this line.
#pragma warning restore CA2009
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.