Share via


CA1832: Tartományalapú indexelők helyett AsSpan vagy AsMemory használata a tömb ReadOnlySpan vagy ReadOnlyMemory részének lekéréséhez

Tulajdonság Érték
Szabályazonosító CA1832
Cím Tartományalapú indexelők helyett AsSpan vagy AsMemory használata a tömb ReadOnlySpan vagy ReadOnlyMemory 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 ReadOnlySpan<T>ReadOnlyMemory<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 ReadOnlyMemory<T> értékkéntReadOnlySpan<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:

  • ReadOnlySpan<SomeT> slice = arr[a..b];
  • ReadOnlyMemory<SomeT> slice = arr[a..b];

Nem észleli

Explicit konverziók:

  • ReadOnlySpan<SomeT> slice = (ReadOnlySpan<SomeT>)arr[a..b];
  • ReadOnlyMemory<SomeT> slice = (ReadOnlyMemory<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
        ReadOnlySpan<byte> tmp1 = arr[0..2];
        ReadOnlyMemory<byte> tmp3 = arr[5..8];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violations fixed with AsSpan or AsMemory accordingly
        ReadOnlySpan<byte> tmp1 = arr.AsSpan()[0..2];
        ReadOnlyMemory<byte> tmp3 = arr.AsMemory()[5..8];
        ...
    }
}

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

Code fix for CA1832 - Use AsSpan or AsMemory instead of Range-based indexers for getting ReadOnlySpan or ReadOnlyMemory portion of an array

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

class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation occurs
        ReadOnlySpan<byte> tmp1 = arr[0..2];
        ReadOnlyMemory<byte> tmp3 = arr[5..8];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation fixed with explicit casting
        ReadOnlySpan<byte> tmp1 = (ReadOnlySpan<byte>)arr[0..2];
        ReadOnlyMemory<byte> tmp3 = (ReadOnlyMemory<byte>)arr[5..8];
        ...
    }
}

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

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

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

Kapcsolódó információk