Memory2D<T>
Memory2D<T>
es un tipo que refleja la funcionalidad del tipo Memory<T>
, con la diferencia de que se puede usar para representar ubicaciones de memoria 2D. Es extremadamente flexible y es capaz de ajustar una serie de tipos diferentes, incluidas matrices ND (con compatibilidad explícita con matrices 1D, 2D y 3D) o instancias Memory<T>
. Este tipo está diseñado para usarse junto con el tipo Span2D<T>
, de la misma manera que Memory<T>
se usa junto con Span<T>
. Para obtener más información sobre las diferencias clave y los escenarios de casos de uso de estos dos tipos, puede leer esta página de documentos.
API de plataforma:
Memory2D<T>
,Span2D<T>
,ReadOnlyMemory2D<T>
Funcionamiento
El tipo Memory2D<T>
realiza un seguimiento interno del área de memoria 2D asignada a través de una referencia al objeto ajustado, los parámetros de alto y ancho y un parámetro de inclinación especial. El alto y el ancho indican la longitud de las filas y columnas del área de memoria 2D, mientras que el tono indica el desplazamiento entre el final de cada fila y el inicio del siguiente.
Este es un diagrama sencillo que ilustra esta configuración (las celdas "XX" de la cuadrícula representan elementos que pertenecen al área de memoria 2D de destino):
// _____________________stride_____...
// reference__ /________width_________ ________...
// \/ \/
// | -- | -- | |- | -- | -- | -- | -- | -- | -- | -- |_
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- | |
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- | |
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- | |_height
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- |_|
// | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
// | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
// ...__pitch__/
// ...________/
Esta configuración permite a Memory2D<T>
ser extremadamente flexible en la forma en que asigna los búferes existentes a las áreas de memoria 2D, ya que permite también representar búferes no ambiguos como una ubicación de memoria 2D "virtual". Por ejemplo, estos son algunos ejemplos de tipos de búfer a los que una instancia Memory2D
puede asignar:
- Matriz 1D
T[]
que se asigna como un área de memoria 2D en orden principal de fila. - Matriz 2D
T[,]
, asignada directamente a una instancia deMemory2D<T>
. - Matriz 3D
T[,,]
, con una instanciaMemory2D<T>
que representa un segmento de profundidad determinado (una capa).
El tipo Memory<T>
también expone una serie de métodos de utilidad, incluida la mayoría de la misma superficie de API que implementa el estándar Memory<T>
. Por ejemplo, incluye un método Slice(int, int)
que facilita las operaciones de segmentación 2D directamente en la ubicación de memoria 2D virtual, con la instancia Memory2D<T>
ajustando automáticamente los parámetros necesarios internamente para desplazar su asignación en las áreas de memoria adecuadas correspondientes al resultado solicitado.
Sintaxis
Aquí se muestra cómo puede crear una instancia Memory2D<T>
a partir de una matriz 2D:
int[,] array =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
Memory2D<int> memory = array;
// The memory directly maps the 2*3 array here
Memory2D<int> slice = memory.Slice(0, 1, 2, 2);
// We create a slice from row 0 and column 1, of size 2*2
int[,] copy = slice.ToArray();
// { 2, 3 }
// { 5, 6 }
// If on a supported runtime, we can also slice using a range
Memory2D<int> test = memory[.., ..2];
// { 1, 2 }
// { 4, 5 }
// { 7, 8 }
Span2D<int> span = memory.Span;
// We can use the span to perform operations on the underlying
// data for the memory instance. All the available APIs are
// documented in the docs about the Span2D<T> type.
ReadOnlyMemory2D<T>
ReadOnlyMemory2D<T>
es para el tipo Memory2D<T>
lo mismo que ReadOnlyMemory<T>
es para Memory<T>
. Expone justo las mismas funcionalidades (menos las API que implican modificar el contenido del área de memoria ajustada) y proporciona una vista de solo lectura a ubicaciones de memoria 2D arbitrarias. Para obtener más información sobre cómo funciona este tipo, puede consultar el párrafo sobre el tipo Memory2D<T>
antes.
Ejemplos
Encontrará más ejemplos en las pruebas unitarias.
.NET Community Toolkit