Sdílet prostřednictvím


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

Tyto typy definují rozšiřující metody, které vytvoří novou neměnnou kolekci z existující IEnumerable<T> kolekce.

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í .

Oprava kódu pro CA2009 – Nevolejte ToImmutableCollection na hodnotu ImmutableCollection

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.

Viz také