Share via


CA1831: AsSpan gebruiken in plaats van op bereik gebaseerde indexeerfuncties voor tekenreeksen indien van toepassing

Eigenschappen Weergegeven als
Regel-id CA1831
Titel AsSpan gebruiken in plaats van op bereik gebaseerde indexeerfuncties voor tekenreeksen, indien van toepassing
Categorie Prestaties
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Als waarschuwing

Oorzaak

Een bereikindexeerfunctie wordt gebruikt voor een tekenreeks en de waarde wordt impliciet toegewezen aan ReadOnlySpan<char>.

Beschrijving van regel

Deze regel wordt geactiveerd wanneer u een bereikindexeerfunctie op een tekenreeks gebruikt en deze toewijst aan een spantype. De bereikindexeerfunctie op een Span<T> is een niet-kopieerbewerking Slice , maar voor de bereikindexeerfunctie op een tekenreeks wordt de methode Substring gebruikt in plaats van Slice. Hiermee wordt een kopie gemaakt van het aangevraagde gedeelte van de tekenreeks. Deze kopie is meestal niet nodig wanneer deze impliciet wordt gebruikt als een ReadOnlySpan<T> of ReadOnlyMemory<T> meer waarden. Als een kopie niet is bedoeld, gebruikt u de AsSpan methode om onnodige kopie te voorkomen. Als de kopie is bedoeld, wijst u deze eerst toe aan een lokale variabele of voegt u een expliciete cast toe. De analyse rapporteert alleen wanneer een impliciete cast wordt gebruikt op het resultaat van de bereikindexeerbewerking.

Detecteert

Impliciete conversie:

ReadOnlySpan<char> slice = str[a..b];

Detecteert niet

Expliciete conversie:

ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[a..b];

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, gebruikt AsSpan u in plaats van de Rangeindexeerfunctie op basis van de tekenreeks om onnodige gegevenskopieën te voorkomen.

public void TestMethod(string str)
{
    // The violation occurs
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation fixed with AsSpan extension method
    ReadOnlySpan<char> slice = str.AsSpan()[1..3];
    ...
}

Tip

Er is een codeoplossing beschikbaar voor deze regel in Visual Studio. Als u deze wilt gebruiken, plaatst u de cursor op de schending en drukt u op Ctrl+. (punt). Kies AsSpan gebruiken in plaats van de op bereik gebaseerde indexeerfunctie op een tekenreeks in de lijst met opties die worden weergegeven.

Code fix for CA1831 - Use AsSpan instead of Range-based indexers when appropriate

U kunt ook een expliciete cast toevoegen om deze waarschuwing te voorkomen.

public void TestMethod(string str)
{
    // The violation occurs.
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation avoided with explicit casting.
    ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[1..3];
    ...
}

Wanneer waarschuwingen onderdrukken

Het is veilig om een schending van deze regel te onderdrukken als het maken van een kopie is bedoeld.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

#pragma warning disable CA1831
// The code that's violating the rule is on this line.
#pragma warning restore CA1831

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

[*.{cs,vb}]
dotnet_diagnostic.CA1831.severity = none

Als u deze hele categorie regels wilt uitschakelen, stelt u de ernst voor de categorie none in op in het configuratiebestand.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Performance.severity = none

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Zie ook