CA2009: Ne hívja meg a ToImmutableCollection függvényt egy nem módosítható gyűjtemény értéken

Tulajdonság Érték
Szabályazonosító CA2009
Cím Ne hívja meg a ToImmutableCollection függvényt egy nem módosítható Collection értéken
Kategória Megbízhatóság
A javítás romboló vagy nem romboló Nem törhető
Alapértelmezés szerint engedélyezve a .NET 10-ben Javaslatként
Alkalmazandó nyelvek C# és Visual Basic

Ok

ToImmutable metódust szükségtelenül meghívtak egy névtérből származó nem módosítható gyűjteményre System.Collections.Immutable .

Szabály leírása

System.Collections.Immutable A névtér nem módosítható gyűjteményeket definiáló típusokat tartalmaz. Ez a szabály a következő nem módosítható gyűjteménytípusokat elemzi:

Ezek a típusok olyan bővítménymetszeteket határoznak meg, amelyek új, nem módosítható gyűjteményt hoznak létre egy meglévő IEnumerable<T> gyűjteményből.

Ezek a kiterjesztési metódusok azért lettek létrehozva, hogy egy módosítható gyűjteményt módosíthatatlanná alakítsanak át. Előfordulhat azonban, hogy a hívó véletlenül egy nem módosítható gyűjteményt ad át a metódusok bemeneteként. Ez teljesítmény- és/vagy funkcionális problémát jelenthet.

  • Teljesítménnyel kapcsolatos probléma: Szükségtelen dobozolás, kicsomagolás és/vagy futásidejű típusellenőrzések egy nem módosítható gyűjteményen.
  • Lehetséges funkcionális probléma: A hívó feltételezése szerint egy módosítható gyűjteményen működött, miközben valójában egy nem módosítható gyűjtemény volt.

Szabálysértések kijavítása

A hibák kijavításához távolítsa el a redundáns ToImmutable hívást egy módosíthatatlan gyűjteményből. A következő két kódrészlet például a szabály megsértését és azok kijavítását mutatja:

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.

Ehhez a szabályhoz kódjavítás érhető el a Visual Studióban. A használathoz helyezze a kurzort a szabálysértésre, és nyomja le a Ctrl+ billentyűt. (pont). Válassza a Redundáns hívás eltávolítása lehetőséget a megjelenő lehetőségek listájából.

A CA2009 kódjavítása – Ne hívja meg a ToImmutableCollection függvényt egy nem módosíthatóCollection-értéken

Mikor kell letiltani a figyelmeztetéseket?

Ne tiltsa el a szabály megsértését, hacsak nem aggódik a nem módosítható gyűjtemények szükségtelen lefoglalásai által gyakorolt teljesítményhatás miatt.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

#pragma warning disable CA2009
// The code that's violating the rule is on this line.
#pragma warning restore CA2009

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = none

További információ: Kódelemzési figyelmeztetések letiltása.

Lásd még