Freigeben über


CA2009: „ToImmutableCollection“ nicht für einen ImmutableCollection-Wert aufrufen.

Eigenschaft Wert
Regel-ID CA2009
Titel „ToImmutableCollection“ nicht für einen ImmutableCollection-Wert aufrufen.
Kategorie Zuverlässigkeit
Fix führt zu Unterbrechungen oder bleibt funktionsfähig Untrennbar
Standardmäßig in .NET 10 aktiviert Als Vorschlag
Anwendbare Sprachen C# und Visual Basic

Ursache

Die ToImmutable-Methode wurde unnötigerweise für eine unveränderliche Auflistung aus dem System.Collections.Immutable-Namensraum aufgerufen.

Regelbeschreibung

System.Collections.Immutable Namespace enthält Typen, die unveränderliche Auflistungen definieren. Diese Regel analysiert die folgenden unveränderlichen Auflistungstypen:

Diese Typen definieren Erweiterungsmethoden, die eine neue unveränderliche Auflistung aus einer vorhandenen IEnumerable<T> Auflistung erstellen.

Diese Erweiterungsmethoden dienen dazu, eine änderbare Sammlung in eine unveränderliche Sammlung zu konvertieren. Allerdings kann der Aufrufer versehentlich eine unveränderliche Auflistung als Eingabe an diese Methoden übergeben. Dies kann ein Leistungs- und/oder ein funktionales Problem darstellen.

  • Leistungsproblem: Unnötige Boxing-, Unboxing- und/oder Laufzeittypüberprüfungen für eine unveränderliche Kollektion.
  • Mögliches Funktionsproblem: Der Aufrufer hat eine änderbare Sammlung angenommen, als es tatsächlich eine unveränderliche Sammlung war.

So beheben Sie Verstöße

Um Verstöße zu beheben, entfernen Sie den redundanten ToImmutable-Aufruf einer unveränderlichen Auflistung. Die folgenden beiden Codeausschnitte zeigen z. B. einen Verstoß gegen die Regel und wie dieser korrigiert werden kann:

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);
    }
}

Tipp

Für diese Regel ist ein Codefix in Visual Studio verfügbar. Um es zu verwenden, setzen Sie den Cursor auf den Verstoß und drücken Sie Strg+. (Punkt). Wählen Sie in der Liste der angezeigten Optionen redundante Aufrufe entfernen aus.

Code-Korrektur für CA2009 - Rufen Sie ToImmutableCollection nicht auf einem ImmutableCollection-Wert auf

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Verstöße gegen diese Regel, es sei denn, Sie haben keine Bedenken hinsichtlich der Leistungsbeeinträchtigungen durch unnötige Allokationen unveränderlicher Sammlungen.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

#pragma warning disable CA2009
// The code that's violating the rule is on this line.
#pragma warning restore CA2009

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad auf none in der Konfigurationsdatei fest.

[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Siehe auch