lundi 1 juin 2020

ReadOnlySpan

 

🧩 ReadOnlySpan<char> en C# — Explication claire

ReadOnlySpan<char> est une structure introduite à partir de C# 7.2 / .NET Core 2.1, conçue pour travailler avec des sous-séquences de texte (ou d'autres types) sans allouer de mémoire supplémentaire.


Définition :

ReadOnlySpan<char> est un pointeur sûr et léger vers une portion de mémoire contenant des caractères, en lecture seule.

🔍 À quoi ça sert ?

  • Éviter les allocations temporaires (ex : pas de Substring() qui crée une nouvelle string).

  • Travailler efficacement avec des morceaux de texte.

  • Très utile dans les parsers, analyseurs de texte, algorithmes de performance, etc.

  • Plus rapide et plus sûr que manipuler directement des pointeurs ou des tableaux.


🔧 Exemple simple :

string text = "Bonjour le monde";

// Pas de copie mémoire : juste une "fenêtre" sur la mémoire
ReadOnlySpan<char> span = text.AsSpan(8, 5);

Console.WriteLine(span.ToString()); // Affiche "le mo"

Ici, on n’a pas créé de nouvelle chaîne. On regarde juste dans la mémoire de text, de l’index 8, sur 5 caractères.


⚠️ Caractéristiques importantes :

Caractéristique Détail
🛡️ Lecture seule Impossible de modifier les données
⚡ Haute performance Pas d’allocation → zéro garbage
🔐 Memory-safe Ne peut pas sortir du buffer
🕓 Stack-only Ne peut pas être stocké dans un champ d’objet ou variable statique

🚫 Ce que ReadOnlySpan<char> ne peut pas faire :

  • Pas stocké dans une propriété ou un champ d’objet (c’est une ref struct)

  • Pas utilisé dans async / await ou iterator (yield return)

  • Pas capturé dans une lambda (fermeture)


🎯 Comparaison avec string vs ReadOnlySpan<char>

Opération string ReadOnlySpan<char>
Alloue mémoire ? ✅ oui ❌ non
Mutable ? ❌ non ❌ non
Découpe performante ❌ lente (Substring()) ✅ rapide avec AsSpan()

🛠 Exemple utile : parsing sans allocation

string line = "Name: John Doe";
ReadOnlySpan<char> span = line.AsSpan();

if (span.StartsWith("Name:"))
{
    ReadOnlySpan<char> name = span.Slice(6); // "John Doe"
    Console.WriteLine(name.ToString());
}

Aucun commentaire:

Enregistrer un commentaire

ReadOnlySpan Lượt xem: