Tipos relacionados con el intervalo y la memoria
A partir de .NET Core 2.1, .NET incluye una serie de tipos interrelacionados que representan una región contigua de memoria arbitraria fuertemente tipada. Se incluyen los siguientes:
System.Span<T>, un tipo que se usa para acceder a una región de memoria contigua. Se puede respaldar una instancia de Span<T> mediante cualquier matriz de tipo
T
, un elemento String, a búfer asignado con stackalloc o un puntero a memoria sin administrar. Como debe asignarse en la pila, tiene una serie de restricciones. Por ejemplo, un campo de una clase no puede ser de tipo Span<T>, ni se puede usar un intervalo en operaciones asincrónicas.System.ReadOnlySpan<T>, una versión inmutable de la estructura Span<T>.
System.Memory<T>, un contenedor en un área de memoria contigua. Se puede respaldar una instancia de Memory<T> mediante cualquier matriz de tipo
T
, un elemento String o un administrador de memoria. Como puede almacenarse en el montón administrado, Memory<T> no tiene ninguna de las limitaciones de Span<T>.System.ReadOnlyMemory<T>, una versión inmutable de la estructura Memory<T>.
System.Buffers.MemoryPool<T>, que asigna bloques de memoria fuertemente tipados de un grupo de memoria a un propietario. Se pueden alquilar instancias de IMemoryOwner<T> del grupo mediante la llamada a MemoryPool<T>.Rent y liberarse de nuevo en el grupo mediante la llamada a MemoryPool<T>.Dispose().
System.Buffers.IMemoryOwner<T>, que representa el propietario de un bloque de memoria y controla su administración de duración.
MemoryManager<T>, una clase base abstracta que puede usarse para reemplazar la implementación de Memory<T> para que Memory<T> pueda respaldarse mediante tipos adicionales, como controladores seguros. MemoryManager<T> está pensado para escenarios avanzados.
ArraySegment<T>, un contenedor para un determinado número de elementos de matriz, que comienza en un índice determinado.
System.MemoryExtensions, una colección de métodos de extensión para convertir cadenas, matrices y segmentos de matriz en bloques de Memory<T>.
System.Span<T>, System.Memory<T> y sus homólogos de solo lectura están diseñados para permitir la creación de algoritmos que eviten la copia de memoria o la asignación en el montón administrado más de lo necesario. Su creación (ya sea mediante Slice
o sus constructores) no implica la duplicación de los búferes subyacentes: solo se actualizan las referencias y desplazamientos relevantes, que representan la "vista" de la memoria encapsulada.
Nota
En plataformas anteriores, Span<T> y Memory<T> están disponibles en el paquete NuGet System.Memory.
Para obtener más información, vea el espacio de nombres System.Buffers.
Uso de memoria e intervalo
Dado que los tipos relacionados con el intervalo y la memoria se usan normalmente para almacenar datos en una canalización de procesamiento, es importante que los desarrolladores sigan un conjunto de procedimientos recomendados al usar Span<T>, Memory<T> y tipos relacionados. Estos procedimientos recomendados se documentan en las directrices de uso de Memory<T> y Span<T>.