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


CA1833: Tartományalapú indexelők helyett AsSpan vagy AsMemory használata tömb span vagy memória részének lekéréséhez

Tulajdonság Érték
Szabályazonosító CA1833
Cím Tartományalapú indexelők helyett AsSpan vagy AsMemory használata tömb span vagy memória részének lekéréséhez
Kategória Teljesítmény
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

Ha tartományindexelőt használ egy tömbön, és implicit módon rendeli hozzá az értéket vagy Span<T>Memory<T>a .

Szabály leírása

A tartományindexelő egy Span<T> nem másolási Slice művelet. A tömb tartományindexelője azonban a metódust használja a tömb kért részének másolatát előállító metódus GetSubArray helyett Slice. Ez a másolat általában szükségtelen, ha implicit módon használják értékként vagy Memory<T> értékkéntSpan<T>. Ha a másolat nem a cél, használja a vagy AsMemory a AsSpan metódust a szükségtelen másolás elkerüléséhez. Ha a másolat célja, először rendelje hozzá egy helyi változóhoz, vagy adjon hozzá egy explicit leadott példányt. Az elemző csak akkor jelenti, ha implicit leadás van használva a tartományindexelő művelet eredményén.

Észleli

Implicit konverziók:

  • Span<SomeT> slice = arr[a..b];
  • Memory<SomeT> slice = arr[a..b];

Nem észleli

Explicit konverziók:

  • Span<SomeT> slice = (Span<SomeT>)arr[a..b];
  • Memory<SomeT> slice = (Memory<SomeT>)arr[a..b];

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

A szabály megsértésének kijavításához használja a vagy AsMemory a AsSpan bővítménymetódust a szükségtelen adatmásolatok létrehozásának elkerüléséhez.

class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation occurs for both statements below
        Span<byte> tmp2 = arr[0..5];
        Memory<byte> tmp4 = arr[5..10];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violations fixed with AsSpan or AsMemory accordingly
        Span<byte> tmp2 = arr.AsSpan()[0..5];
        Memory<byte> tmp4 = arr.AsMemory()[5..10];
        ...
    }
}

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 az AsMemory használata lehetőséget egy tömb tartományalapú indexelője helyett a bemutatott lehetőségek listájából.

Code fix for CA1833 - Use AsSpan or AsMemory instead of Range-based indexers for getting Span or Memory portion of an array

Ezt a figyelmeztetést explicit leadással is elkerülheti.

class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation occurs
        Span<byte> tmp1 = arr[0..5];
        Memory<byte> tmp2 = arr[5..10];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation fixed with explicit casting
        Span<byte> tmp1 = (Span<byte>)arr[0..5];
        Memory<byte> tmp2 = (Memory<byte>)arr[5..10];
        ...
    }
}

Mikor kell letiltani a figyelmeztetéseket?

Ha másolatot szeretne létrehozni, nyugodtan letilthatja a szabály megsértését.

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 CA1833
// The code that's violating the rule is on this line.
#pragma warning restore CA1833

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.CA1833.severity = none

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

Kapcsolódó információk