Share via


CA1846: Föredra AsSpan framför Substring

Property Värde
Regel-ID CA1846
Title Föredra AsSpan framför Substring
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

Resultatet av ett anrop till en av överlagringarna String.Substring skickas till en metod med en tillgänglig överlagring som accepterar ReadOnlySpan<Char>.

Regelbeskrivning

Substring allokerar ett nytt string objekt på heapen och utför en fullständig kopia av den extraherade texten. Strängmanipulering är en flaskhals för prestanda för många program. Om du allokerar många små, kortlivade strängar på en frekvent sökväg kan det skapa tillräckligt med insamlingstryck för att påverka prestandan. De O(n) kopior som skapas av Substring blir relevanta när delsträngarna blir stora. Typerna Span<T> och ReadOnlySpan<T> skapades för att lösa dessa prestandaproblem.

Många API:er som accepterar strängar har också överlagringar som accepterar ett ReadOnlySpan<System.Char> argument. När sådana överbelastningar är tillgängliga kan du förbättra prestanda genom att anropa AsSpan i stället Substringför .

Så här åtgärdar du överträdelser

Om du vill åtgärda en överträdelse av den här regeln ersätter du anropet till string.Substring med ett anrop till någon av tilläggsmetoderna MemoryExtensions.AsSpan .

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

När du ska ignorera varningar

Det är säkert att ignorera varningar från den här regeln om prestanda inte är ett problem.

Se även