loading experience

C#

Span e ReadOnlySpan in C# 14: conversioni implicite

Array e stringhe diventano Span senza cast: codice più pulito e API ad alte prestazioni più facili da usare.

Span e ReadOnlySpan in C# 14: conversioni implicite

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.

Le conversioni implicite portano array e stringhe verso le API basate su span.
Le conversioni implicite portano array e stringhe verso le API basate su span.

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.

Lascia un commento