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 9 | 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.
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.
Gerelateerde regels
- CA1832: AsSpan of AsMemory gebruiken in plaats van op range gebaseerde indexeerfuncties voor het ophalen van ReadOnlySpan of ReadOnlyMemory-gedeelte van een matrix
- CA1833: AsSpan of AsMemory gebruiken in plaats van indexeerfuncties op basis van bereik voor het ophalen van span- of geheugengedeelte van een matrix