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.

Voir aussi