CA2009: Roep ToImmutableCollection niet aan op een immutableCollection-waarde
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2009 |
Titel | ToImmutableCollection niet aanroepen op een ImmutableCollection-waarde |
Categorie | Betrouwbaarheid |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Als suggestie |
Oorzaak
ToImmutable
methode werd onnodig aangeroepen op een onveranderbare verzameling uit System.Collections.Immutable naamruimte.
Beschrijving van regel
System.Collections.Immutable naamruimte bevat typen waarmee onveranderbare verzamelingen worden gedefinieerd. Met deze regel worden de volgende onveranderbare verzamelingstypen geanalyseerd:
- 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>
Deze typen definiëren extensiemethoden waarmee een nieuwe onveranderbare verzameling wordt gemaakt op basis van een bestaande IEnumerable<T> verzameling.
- ImmutableArray<T> definieert ToImmutableArray.
- ImmutableList<T> definieert ToImmutableList.
- ImmutableHashSet<T> definieert ToImmutableHashSet.
- ImmutableSortedSet<T> definieert ToImmutableSortedSet.
- ImmutableDictionary<TKey,TValue> definieert ToImmutableDictionary.
- ImmutableSortedDictionary<TKey,TValue> definieert ToImmutableSortedDictionary.
Deze uitbreidingsmethoden zijn ontworpen om een onveranderbare verzameling te converteren naar een onveranderbare verzameling. De aanroeper kan echter per ongeluk een onveranderbare verzameling doorgeven als invoer voor deze methoden. Dit kan een prestatie- en/of functioneel probleem vertegenwoordigen.
- Prestatieprobleem: onnodige boksen, uitboxing en/of runtime-type controles op een onveranderbare verzameling.
- Potentieel functioneel probleem: Aanroeper ging ervan uit dat deze werkt op een onveranderbare verzameling, toen het daadwerkelijk een onveranderbare verzameling had.
Schendingen oplossen
Als u schendingen wilt oplossen, verwijdert u de redundante ToImmutable
aanroep van een onveranderbare verzameling. In de volgende twee codefragmenten ziet u bijvoorbeeld een schending van de regel en hoe u deze kunt oplossen:
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);
}
}
Tip
Er is een codeoplossing beschikbaar voor deze regel in Visual Studio. Als u deze wilt gebruiken, plaatst u de cursor op de schending en drukt u op Ctrl+. (punt). Kies Redundante aanroep verwijderen uit de lijst met opties die worden weergegeven.
Wanneer waarschuwingen onderdrukken
Onderdruk geen schendingen van deze regel, tenzij u zich geen zorgen maakt over de gevolgen voor de prestaties van onnodige toewijzingen van onveranderbare verzamelingen.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA2009
// The code that's violating the rule is on this line.
#pragma warning restore CA2009
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.