CA1846 : préférez AsSpan
à Substring
Propriété | Value |
---|---|
Identificateur de la règle | CA1846 |
Titre | Préférer AsSpan à Substring |
Catégorie | Performances |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | À titre de suggestion |
Cause
Le résultat d’un appel à l’une des surcharges String.Substring est passé à une méthode avec une surcharge disponible qui accepte ReadOnlySpan<Char>
.
Description de la règle
Substring
alloue un nouvel objet string
sur le tas et effectue une copie complète du texte extrait. La manipulation de chaînes est un goulot d’étranglement des performances pour de nombreux programmes. L’allocation de nombreuses petites chaînes de courte durée sur un chemin chaud peut créer une pression de collecte suffisante pour avoir un impact sur les performances. Les copies O(n) créées par Substring
deviennent pertinentes lorsque les sous-chaînes deviennent volumineuses. Les types Span<T> et ReadOnlySpan<T> ont été créés pour résoudre ces problèmes de performances.
De nombreuses API qui acceptent des chaînes ont également des surcharges qui acceptent un argument ReadOnlySpan<System.Char>
. Lorsque de telles surcharges sont disponibles, vous pouvez améliorer les performances en appelant AsSpan
au lieu de Substring
.
Comment corriger les violations
Pour corriger une violation de cette règle, remplacez l’appel à string.Substring
par un appel à l’une des méthodes d’extension 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
Quand supprimer les avertissements
Vous pouvez sans risque supprimer les avertissements de cette règle si les performances ne sont pas une préoccupation.