Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
| 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:
- 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>
Diese Typen definieren Erweiterungsmethoden, die eine neue unveränderliche Auflistung aus einer vorhandenen IEnumerable<T> Auflistung erstellen.
- ImmutableArray<T> definiert ToImmutableArray.
- ImmutableList<T> definiert ToImmutableList.
- ImmutableHashSet<T> definiert ToImmutableHashSet.
- ImmutableSortedSet<T> definiert ToImmutableSortedSet.
- ImmutableDictionary<TKey,TValue> definiert ToImmutableDictionary.
- ImmutableSortedDictionary<TKey,TValue> definiert ToImmutableSortedDictionary.
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.
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.