Megosztás a következőn keresztül:


CA2009: Ne hívja meg a ToImmutableCollection függvényt egy nem módosíthatóCollection é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 kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Javaslatként

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 bővítménymetelyek úgy lettek kialakítva, hogy egy mutable-gyűjteményt módosíthatatlan gyűjteménysé alakítsa á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: A nem módosítható gyűjtemények szükségtelen dobozolása, kicsomagolása és/vagy futásideje.
  • Lehetséges funkcionális probléma: A hívó azt feltételezte, hogy egy mutable gyűjteményen működik, amikor valójában nem módosítható gyűjtemény volt.

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

A szabálysértések kijavításához távolítsa el a redundáns ToImmutable hívást egy nem módosítható gyűjteményen. 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.

Code fix for CA2009 - Do not call ToImmutableCollection on an ImmutableCollection value

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.

Kapcsolódó információk