Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
CA1846: Voorkeur
| Eigenschap | Waarde |
|---|---|
| Regel-id | CA1846 |
| Titel | Voorkeur AsSpan boven Substring |
| Categorie | Prestaties |
| Fix kan brekend of niet-brekend zijn | Niet-brekend |
| Standaard ingeschakeld in .NET 10 | Als suggestie |
| Toepasselijke talen | C# en Visual Basic |
Oorzaak
Het resultaat van een aanroep naar een van de String.Substring overbelastingen wordt doorgegeven aan een methode met een beschikbare overbelasting die accepteert ReadOnlySpan<Char>.
Beschrijving van regel
Substring wijst een nieuw string object toe aan de heap en voert een volledige kopie van de geëxtraheerde tekst uit. Het bewerken van tekenreeksen is een prestatieknelpunt voor veel programma's. Het toewijzen van veel kleine, kortlevende strings op een veelgebruikte pad kan genoeg geheugenverzamelingsdruk veroorzaken om de prestaties te beïnvloeden. De O(n) kopieën die door Substring zijn gemaakt, worden relevant wanneer de subtekenreeksen groot worden. De Span<T> en ReadOnlySpan<T> typen zijn gemaakt om deze prestatieproblemen op te lossen.
Veel API's die tekenreeksen accepteren, hebben ook overbelastingen die een ReadOnlySpan<System.Char> argument accepteren. Wanneer dergelijke overbelastingen beschikbaar zijn, kunt u de prestaties verbeteren door AsSpan aan te roepen in plaats van Substring.
Hoe schendingen op te lossen
Als u een schending van deze regel wilt oplossen, vervangt u de aanroep van string.Substring een aanroep naar een van de MemoryExtensions.AsSpan extensiemethoden.
using System;
public void MyMethod(string iniFileLine)
{
// Violation
int.TryParse(iniFileLine.Substring(7), out int x);
int.TryParse(iniFileLine.Substring(2, 5), out int y);
// Fix
int.TryParse(iniFileLine.AsSpan(7), out int x);
int.TryParse(iniFileLine.AsSpan(2, 5), out int y);
}
Imports System
Public Sub MyMethod(iniFileLine As String)
Dim x As Integer
Dim y As Integer
' Violation
Integer.TryParse(iniFileLine.Substring(7), x)
Integer.TryParse(iniFileLine.Substring(2, 5), y)
' Fix
Integer.TryParse(iniFileLine.AsSpan(7), x)
Integer.TryParse(iniFileLine.AsSpan(2, 5), y)
End Sub
Wanneer waarschuwingen onderdrukken
Het is veilig om waarschuwingen van deze regel te onderdrukken als de prestaties geen probleem zijn.