Condividi tramite


Tipi correlati alla memoria e tipi di estensione

.NET include diversi tipi correlati che rappresentano un'area contigua fortemente tipizzata di memoria arbitraria. Questi tipi sono progettati per consentire la creazione di algoritmi che evitano di copiare memoria o allocare nell'heap gestito più del necessario. La loro creazione (tramite Slice, AsSpan(), un'espressione di raccolta o i relativi costruttori) non comporta la duplicazione dei buffer sottostanti: vengono aggiornati solo i riferimenti e gli offset pertinenti, che rappresentano la "visualizzazione" della memoria di cui è stato eseguito il wrapping. Nel codice ad alte prestazioni, gli intervalli vengono spesso usati per evitare di allocare stringhe inutilmente.

I tipi includono:

  • System.Span<T>, un tipo usato per accedere a un'area contigua di memoria. Un'istanza Span<T> può essere supportata da una matrice di tipo T, un buffer allocato con stackalloc o un puntatore alla memoria non gestita. Poiché deve essere allocata nello stack, ha una serie di restrizioni. Ad esempio, un campo in una classe non può essere di tipo Span<T>, né può essere usato nelle operazioni asincrone.

  • System.ReadOnlySpan<T>, una versione non modificabile della Span<T> struttura. Le istanze possono essere supportate anche da un oggetto String.

  • System.Memory<T>, un involucro su un'area contigua di memoria. Un'istanza Memory<T> può essere supportata da una matrice di tipo T o da un gestore di memoria. Poiché può essere archiviato nell'heap gestito, Memory<T> non presenta alcuna limitazione di Span<T>.

  • System.ReadOnlyMemory<T>, una versione non modificabile della Memory<T> struttura. Le istanze possono anche essere supportate da un oggetto String.

  • System.Buffers.MemoryPool<T>, che alloca blocchi di memoria fortemente tipizzati da un pool di memoria per un proprietario. IMemoryOwner<T> Le istanze possono essere noleggiate dal pool chiamando MemoryPool<T>.Rent e rilasciate di nuovo al pool chiamando MemoryPool<T>.Dispose().

  • System.Buffers.IMemoryOwner<T>, che rappresenta il proprietario di un blocco di memoria e ne controlla la gestione della durata.

  • MemoryManager<T>, una classe base astratta che può essere usata per sostituire l'implementazione di Memory<T> in modo che Memory<T> possa essere supportata da tipi aggiuntivi, 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 indice specifico.

  • System.MemoryExtensions, una raccolta di metodi di estensione per la conversione di stringhe, matrici e segmenti di matrice in Memory<T> blocchi.

Per ulteriori informazioni, consultare lo spazio dei nomi System.Buffers.

Lavorare con la memoria e la portata

Poiché i tipi correlati alla memoria e all'intervallo vengono in genere usati per archiviare i dati in una pipeline di elaborazione, è importante seguire un set di procedure consigliate quando si usano Span<T>Memory<T>, e i tipi correlati. Queste procedure consigliate sono documentate nelle linee guida per l'utilizzo di Memory<T> e Span<T>.

Vedere anche