Types liés à la mémoire et l’étendue
À compter de .NET Core 2.1, .NET inclut un certain nombre de types liés qui représentent une région contiguë et fortement typée de mémoire arbitraire. Il s’agit notamment des paramètres suivants :
System.Span<T>, un type utilisé pour accéder à une zone contiguë de mémoire. Une instance Span<T> peut être sauvegardée par un tableau de type
T
, un objet String, une mémoire tampon allouée avec stackalloc, ou un pointeur vers une mémoire non managée. Comme elle doit être allouée sur la pile, elle comporte plusieurs restrictions. Par exemple, un champ dans une classe ne peut pas être de type Span<T>, et l’étendue ne peut pas être utilisée dans des opérations asynchrones.System.ReadOnlySpan<T>, une version immuable de la structure Span<T>.
System.Memory<T>, wrapper sur une région contiguë de mémoire. Une Memory<T> instance peut être sauvegardée par un tableau de type
T
, ou un Stringgestionnaire de mémoire. Comme il peut être stocké sur le tas managé, Memory<T> n’a aucune des limitations de Span<T>.System.ReadOnlyMemory<T>, une version immuable de la structure Memory<T>.
System.Buffers.MemoryPool<T>, qui alloue des blocs de mémoire fortement typés d’un pool de mémoire à un propriétaire. Les instances IMemoryOwner<T> peuvent être louées à partir du pool en appelant MemoryPool<T>.Rent puis replacées dans le pool en appelant MemoryPool<T>.Dispose().
System.Buffers.IMemoryOwner<T>, qui représente le propriétaire d’un bloc de mémoire et gère la durée de vie.
MemoryManager<T>, une classe de base abstraite qui peut être utilisée pour remplacer l’implémentation de Memory<T> afin de sauvegarder Memory<T> par des types supplémentaires, par exemple des descripteurs sécurisés. MemoryManager<T> s’applique à des scénarios avancés.
ArraySegment<T>, un wrapper pour un certain nombre d’éléments de tableau commençant à un index particulier.
System.MemoryExtensions, une collection de méthodes d’extension pour la conversion de chaînes, de tableaux et de segments de tableau en blocs Memory<T>.
System.Span<T>, System.Memory<T>et leurs équivalents en lecture seule sont conçus pour permettre la création d’algorithmes qui évitent de copier de la mémoire ou d’allouer sur le tas managé plus que nécessaire. La création de ces mémoires (via Slice
ou leurs constructeurs) n’implique pas la duplication des mémoires tampons sous-jacentes : seules les références et décalages pertinents, qui représentent la « vue » de la mémoire encapsulée, sont mises à jour.
Notes
Pour les frameworks antérieurs, Span<T> et Memory<T> sont disponibles dans le package System.Memory NuGet.
Pour plus d'informations, consultez l'espace de noms System.Buffers.
Utilisation de la mémoire et de l’étendue
Étant donné que les types liés à la mémoire et à l’étendue servent généralement à stocker les données dans un pipeline de traitement, il est important que les développeurs suivent un ensemble de meilleures pratiques lorsqu’ils utilisent Span<T>, Memory<T> et des types connexes. Ces bonnes pratiques sont documentées dans les instructions d’utilisation de MemoryT<> et SpanT<>.