Span<T>
n'est qu'une pile par nature, tandis que Memory<T>
peuvent exister sur le tas.
Span<T>
est un nouveau type que nous ajoutons à la plateforme pour représenter pour représenter des régions contiguës de mémoire arbitraire, avec des de performances comparables à celles de T[]. Ses API sont similaires à celles des tableaux, mais contrairement aux tableaux, il peut pointer vers de la mémoire gérée ou native, ou encore vers de la mémoire allouée sur la pile.
Memory <T>
est un type qui complète Span<T>
. Comme indiqué dans son document de conception document, Span<T>
est un type de pile uniquement. La nature de la pile de Span<T>
le rend inadapté à de nombreux scénarios qui nécessitent de stocker des des références à des tampons (représentés par Span<T>
) sur le tas, par exemple pour les routines routines effectuant des appels asynchrones.
async Task DoSomethingAsync(Span<byte> buffer) {
buffer[0] = 0;
await Something(); // Oops! The stack unwinds here, but the buffer below
// cannot survive the continuation.
buffer[0] = 1;
}
Pour résoudre ce problème, nous fournirons un ensemble de types complémentaires, destinés à être utilisés comme des types d'échange d'usage général représentant, tout comme Span <T>
, une gamme de mémoire arbitraire, mais contrairement à Span <T>
ces types ne seront pas uniquement des piles, au prix de pénalités de performance performances pour la lecture et l'écriture dans la mémoire.
async Task DoSomethingAsync(Memory<byte> buffer) {
buffer.Span[0] = 0;
await Something(); // The stack unwinds here, but it's OK as Memory<T> is
// just like any other type.
buffer.Span[0] = 1;
}
Dans l'exemple ci-dessus, le Memory <byte>
est utilisé pour représenter le tampon. Il s'agit d'un type régulier et peut être utilisé dans des méthodes faisant des appels asynchrones. Sa propriété Span renvoie Span<byte>
mais la valeur retournée n'est pas stockée sur le tas pendant les appels asynchrones, mais plutôt de nouvelles valeurs sont produites à partir du Memory<T>
valeur. Dans un sens, Memory<T>
est une usine de Span<T>
.
Document de référence : aquí
4 votes
Voir aussi : C# 7.2 : Comprendre la portée
2 votes
@JeffMercado Y a-t-il une liste complète quelque part des types C# qu'ils peuvent remplacer en plus de string[] ? Sont-ils seulement pour les tableaux ou peuvent-ils aussi être utilisés à la place de types comme List<T> ?