Span<T> e ReadOnlySpan<T> rappresentano una porzione contigua di memoria senza copiarla: sono la base del codice .NET ad alte prestazioni. C# 14 li rende "cittadini di prima classe" con nuove conversioni implicite.
Cosa cambia
Un array può essere convertito implicitamente in Span<T> e ReadOnlySpan<T>, e il compilatore considera queste conversioni anche quando cerca i metodi di estensione. Risultato: le estensioni scritte per ReadOnlySpan<T> si possono chiamare direttamente su un array.
public static class SpanExtensions
{
public static int ContaPari(this ReadOnlySpan<int> valori)
{
var n = 0;
foreach (var v in valori) if (v % 2 == 0) n++;
return n;
}
}
int[] numeri = [1, 2, 3, 4, 5, 6];
Console.WriteLine(numeri.ContaPari()); // 3, senza .AsSpan()
Perché conviene
- Si scrive una sola versione del metodo, per array, stringhe e porzioni di memoria.
- Si evitano copie: lavorare su una porzione con
valori[2..5]non alloca nulla. - Le librerie possono offrire overload basati su span, che il compilatore preferisce automaticamente.
Un esempio con le stringhe
ReadOnlySpan<char> riga = "2026-10-10;ordine;42";
var primo = riga.IndexOf(';');
var data = riga[..primo]; // nessuna nuova stringa
Console.WriteLine(data.ToString()); // 2026-10-10
Un'attenzione: gli span vivono solo sullo stack e non possono essere memorizzati in campi di classi o usati attraverso await. Per questi casi esiste Memory<T>.
Commenti (0)
Nessun commento ancora.