Share via


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

Dessa typer definierar tilläggsmetoder som skapar en ny oföränderlig samling från en befintlig IEnumerable<T> samling.

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.

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

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.

Se även