Tipi correlati alla memoria e agli intervalli
A partire da .NET Core 2.1, .NET include un numero di tipi interrelati che rappresentano un'area contigua e fortemente tipizzata di memoria arbitraria. Queste includono:
System.Span<T>, un tipo usato per accedere a un'area contigua di memoria. Un'istanza di Span<T> può essere supportata da una matrice di tipo
T
, una classe String, un buffer allocato con stackalloc o un puntatore alla memoria non gestita. Poiché deve essere allocato nello stack, presenta alcune restrizioni. Un campo in una classe, ad esempio, non può essere di tipo Span<T> e l'intervallo non può essere usato nelle operazioni asincrone.System.ReadOnlySpan<T>, una versione non modificabile della struttura Span<T>.
System.Memory<T>, un wrapper su un'area contigua di memoria. Un'istanza Memory<T> può essere supportata da una matrice di tipo
T
o da una Stringgestione memoria. Come può essere archiviato nell'heap gestito, Memory<T> non ha alcuna delle limitazioni di Span<T>.System.ReadOnlyMemory<T>, una versione non modificabile della struttura Memory<T>.
System.Buffers.MemoryPool<T>, che alloca blocchi fortemente tipizzato di memoria da un pool di memoria a un proprietario. Le istanze di IMemoryOwner<T> possono essere noleggiate dal pool chiamando MemoryPool<T>.Rent e restituite al pool chiamando MemoryPool<T>.Dispose().
System.Buffers.IMemoryOwner<T>, che rappresenta il proprietario di un blocco di memoria e controlla la gestione della durata.
MemoryManager<T>, una classe di base astratta che può essere usata per sostituire l'implementazione di Memory<T> in modo che Memory<T> possa essere supportato da altri tipi, ad esempio handle sicuri. MemoryManager<T> è destinato a scenari avanzati.
ArraySegment<T>, un wrapper per un determinato numero di elementi di matrice a partire da un determinato indice.
System.MemoryExtensions, una raccolta di metodi di estensione per convertire stringhe, matrici e segmenti di matrici in blocchi Memory<T>.
System.Span<T>, System.Memory<T>e le loro controparti readonly sono progettate per consentire la creazione di algoritmi che evitano la copia della memoria o l'allocazione nell'heap gestito più che necessario. La creazione (tramite Slice
o i relativi costruttori) non comporta la duplicazione dei buffer sottostanti: vengono aggiornati solo i riferimenti e gli offset pertinenti, che rappresentano la "vista" della memoria con wrapping.
Nota
Per i framework precedenti, Span<T> e Memory<T> sono disponibili nel pacchetto NuGet System.Memory.
Per altre informazioni, vedere lo spazio dei nomi System.Buffers.
Uso di memoria e intervalli
Poiché i tipi correlati alla memoria e agli intervalli vengono in genere usati per archiviare i dati in una pipeline di elaborazione, è importante che gli sviluppatori seguano una serie di procedure consigliate quando usano Span<T>, Memory<T> e i tipi correlati. Queste procedure consigliate sono documentate nelle linee guida per l'utilizzo di MemoryT< e SpanT><>.