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.
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ó szabályok
- CA1831: Ha szükséges, tartományalapú indexelők helyett AsSpan használata sztringekhez
- CA1833: Tartományalapú indexelők helyett AsSpan vagy AsMemory használata tömb span vagy memória részének lekéréséhez
Kapcsolódó információk
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: