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 9-ben | Javaslatként |
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 .
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.
Implicit konverziók:
Span<SomeT> slice = arr[a..b];
Memory<SomeT> slice = arr[a..b];
Explicit konverziók:
Span<SomeT> slice = (Span<SomeT>)arr[a..b];
Memory<SomeT> slice = (Memory<SomeT>)arr[a..b];
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.
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];
...
}
}
Ha másolatot szeretne létrehozni, nyugodtan letilthatja a szabály megsértését.
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.
.NET-visszajelzés
A(z) .NET egy nyílt forráskód projekt. Visszajelzés adásához válasszon egy hivatkozást: