Delen via


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 8 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:

Deze typen definiëren extensiemethoden waarmee een nieuwe onveranderbare verzameling wordt gemaakt op basis van een bestaande IEnumerable<T> verzameling.

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.

Code fix for CA2009 - Do not call ToImmutableCollection on an ImmutableCollection value

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.

Zie ook