Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
CA1846: Részesítsd előnyben a
| 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.