Compartir por


Tipos relacionados con el intervalo y la memoria

.NET incluye una serie de tipos interrelacionados que representan una región contigua y fuertemente tipada de memoria arbitraria. Estos tipos están diseñados para permitir la creación de algoritmos que eviten copiar memoria o asignar en el montón administrado más de lo necesario. Crearlos (ya sea a través de Slice, AsSpan(), una expresión de colección o sus constructores) no implica duplicar los búferes subyacentes: solo se actualizan las referencias y desplazamientos pertinentes, que representan la "vista" de la memoria encapsulada. En el código de alto rendimiento, los intervalos se suelen usar para evitar asignar cadenas innecesariamente.

Los tipos incluyen:

  • System.Span<T>, un tipo que se usa para acceder a una región contigua de memoria. Una Span<T> instancia puede ser respaldada por una matriz de tipo T, un búfer asignado con stackalloc o un puntero a la memoria no administrada. 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 span en operaciones asincrónicas.

  • System.ReadOnlySpan<T>, una versión inmutable de la Span<T> estructura. Las instancias también pueden estar respaldadas por String.

  • System.Memory<T>, un contenedor en un área de memoria contigua. Una Memory<T> instancia puede estar respaldada por una matriz de tipo T o un administrador de memoria. Como se puede almacenar 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 Memory<T> estructura. Las instancias también pueden estar respaldadas por String.

  • 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 al propietario de un bloque de memoria y controla la gestión de su ciclo de vida.

  • MemoryManager<T>, una clase base abstracta que se puede usar para reemplazar la implementación de Memory<T> para que Memory<T> pueda ser respaldada por tipos adicionales, como identificadores seguros. MemoryManager<T> está pensado para escenarios avanzados.

  • ArraySegment<T>, un contenedor para un número determinado de elementos de matriz que comienzan en un índice determinado.

  • System.MemoryExtensions, una colección de métodos de extensión para convertir cadenas, matrices y segmentos de matriz en Memory<T> bloques.

Para obtener más información, vea el espacio de nombres System.Buffers.

Uso de memoria e intervalo

Dado que los tipos relacionados con la memoria y los relacionados con intervalos se usan normalmente para almacenar datos en una canalización de procesamiento, es importante seguir un conjunto de procedimientos recomendados al usar Span<T>, Memory<T>y tipos relacionados. Estos procedimientos recomendados se documentan en las guías de uso de Memory T y Span T.

Consulte también