Share via


CA1846: Voorkeur AsSpan boven Substring

Eigenschappen Weergegeven als
Regel-id CA1846
Titel Voorkeur AsSpan boven Substring
Categorie Prestaties
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Als suggestie

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 knelpunt voor de prestaties voor veel programma's. Door veel kleine, korte tekenreeksen op een dynamisch pad toe te wijzen, kan er voldoende verzamelingsdruk ontstaan om de prestaties te beïnvloeden. De O(n) kopieën die zijn gemaakt door Substring relevant te worden 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 te bellen AsSpan in plaats van Substring.

Schendingen oplossen

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.

Zie ook