Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnost | Hodnota |
|---|---|
| ID pravidla | CA2009 |
| Název | Nevolejte ToImmutableCollection pro hodnotu ImmutableCollection |
| Kategorie | Spolehlivost |
| Oprava, která může být destruktivní nebo nedestruktivní | Nezlomitelný |
| Povoleno ve výchozím nastavení v .NET 10 | Jako návrh |
| Příslušné jazyky | C# a Visual Basic |
Příčina
ToImmutable metoda byla zbytečně volána na neměnné kolekci z System.Collections.Immutable oboru jmen.
Popis pravidla
System.Collections.Immutable Obor názvů obsahuje typy, které definují neměnné kolekce. Toto pravidlo analyzuje následující neměnné typy kolekcí:
- 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>
Tyto typy definují rozšiřující metody, které vytvoří novou neměnnou kolekci z existující IEnumerable<T> kolekce.
- ImmutableArray<T> definuje ToImmutableArray.
- ImmutableList<T> definuje ToImmutableList.
- ImmutableHashSet<T> definuje ToImmutableHashSet.
- ImmutableSortedSet<T> definuje ToImmutableSortedSet.
- ImmutableDictionary<TKey,TValue> definuje ToImmutableDictionary.
- ImmutableSortedDictionary<TKey,TValue> definuje ToImmutableSortedDictionary.
Tyto rozšiřující metody jsou navržené tak, aby převáděly proměnlivou kolekci na neměnnou kolekci. Volající však může omylem předat neměnnou kolekci jako vstup do těchto metod. Může to představovat problém s výkonem nebo funkcí.
- Problém s výkonem: Nepotřebné kontroly typu boxing, unboxing a/nebo runtime v neměnné kolekci
- Potenciální funkční problém: Volající předpokládal, že pracuje s proměnlivou kolekcí, zatímco ve skutečnosti byla neměnná.
Jak opravit porušení
Pokud chcete opravit porušení, odeberte redundantní ToImmutable volání na neměnné kolekci. Například následující dva fragmenty kódu ukazují porušení pravidla a způsob jejich opravy:
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
Oprava kódu je k dispozici pro toto pravidlo v sadě Visual Studio. Pokud ho chcete použít, umístěte kurzor na chybu a stiskněte
Kdy potlačit upozornění
Nepotlačujte porušení tohoto pravidla, pokud vám nevadí dopad na výkon z nepotřebných přidělení neměnných kolekcí.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2009
// The code that's violating the rule is on this line.
#pragma warning restore CA2009
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.