CA1846: Részesítsd előnyben a AsSpan-t a Substring-vel szemben

Tulajdonság Érték
Szabályazonosító CA1846
Cím Részesítse előnyben a AsSpan-t a Substring-vel szemben.
Kategória Teljesítmény
A javítás romboló vagy nem romboló Nem törhető
Alapértelmezés szerint engedélyezve a .NET 10-ben Javaslatként
Alkalmazandó nyelvek C# és Visual Basic

Ok

Az egyik String.Substring túlterhelésre irányuló hívás eredménye egy olyan metódusnak lesz átadva, amely elfogadja a rendelkezésre álló túlterhelést ReadOnlySpan<Char>.

Szabály leírása

Substring lefoglal egy új string objektumot a halomra, és végrehajtja a kinyert szöveg teljes másolatát. A karaktersorok kezelése sok program esetében teljesítménybeli szűk keresztmetszet. Az erőforrásigényes elérési úton történő sok kis, rövid élettartamú sztring lefoglalása elegendő gyűjtési nyomást okozhat a teljesítmény befolyásolására. A létrehozott Substring O(n) másolatok akkor válnak relevánssá, ha az alsztringek nagyok lesznek. Span<T> és ReadOnlySpan<T> típusok ezeknek a teljesítményproblémáknak a megoldására lettek létrehozva.

Számos, sztringeket elfogadó API túlterheléssel is rendelkezik, amelyek argumentumot ReadOnlySpan<System.Char> fogadnak el. Ha ilyen túlterhelések állnak rendelkezésre, a teljesítményt javíthatja úgy, hogy a AsSpan függvényt hívja meg a Substring helyett.

Szabálysértések kijavítása

A szabály megsértésének kijavításához cserélje le a hívást string.Substring az egyik bővítménymetely hívására 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

Mikor kell letiltani a figyelmeztetéseket?

Ha a teljesítmény nem jelent problémát, nyugodtan el lehet tiltani a szabály figyelmeztetéseit.

Lásd még