CA2009: Nevolejte ToImmutableCollection u hodnoty ImmutableCollection
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2009 |
Název | Nevolejte ToImmutableCollection pro hodnotu ImmutableCollection |
Kategorie | Spolehlivost |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | Jako návrh |
Příčina
ToImmutable
metoda byla zbytečně volána v neměnné kolekci z System.Collections.Immutable oboru názvů.
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> ToImmutableArraydefinuje .
- ImmutableList<T> ToImmutableListdefinuje .
- ImmutableHashSet<T> ToImmutableHashSetdefinuje .
- ImmutableSortedSet<T> ToImmutableSortedSetdefinuje .
- ImmutableDictionary<TKey,TValue> ToImmutableDictionarydefinuje .
- ImmutableSortedDictionary<TKey,TValue> ToImmutableSortedDictionarydefinuje .
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ádá, že pracuje na proměnlivé kolekci, když skutečně měla neměnnou kolekci.
Jak opravit porušení
Pokud chcete opravit porušení, odeberte redundantní ToImmutable
volání neměnné kolekce. 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 porušení a stiskněte ctrl+. (tečka). V seznamu zobrazených možností zvolte Odebrat redundantní volání .
Kdy potlačit upozornění
Nepotlačujte porušení tohoto pravidla, pokud si nejste jisti dopadem 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.