🧩 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
ouiterator (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