CA2009: Nevolejte metodu ToImmutableCollection na hodnotě ImmutableCollection

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

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á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 Ctrl. (tečka). V seznamu zobrazených možností zvolte Odebrat redundantní volání .

Oprava kódu pro CA2009 – Neukládejte ToImmutableCollection na hodnotu typu ImmutableCollection

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.

Viz také