Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O Memory2D<T> é um tipo que espelha a funcionalidade do tipo Memory<T>, com a diferença de que ele pode ser usado para representar localizações de memória 2D. É extremamente flexível e é capaz de encapsular vários tipos diferentes, incluindo arrays ND (com suporte explícito para arrays 1D, 2D e 3D) ou Memory<T> instâncias. Este tipo destina-se a ser usado em conjunto com o Span2D<T> tipo, da mesma forma que Memory<T> é usado juntamente com Span<T>. Para obter mais informações sobre as principais diferenças e cenários de casos de uso desses dois tipos, você pode ler esta página de documentos.
APIs da plataforma:
Memory2D<T>,Span2D<T>,ReadOnlyMemory2D<T>
Como funciona
O Memory2D<T> tipo rastreia internamente a área de memória 2D mapeada através de uma referência ao objeto encapsulado, os parâmetros de altura e largura e um parâmetro de passo especial. A altura e a largura indicam a extensão das linhas e colunas na área de memória 2D, já que o passo indica o deslocamento entre o final de cada linha e o início da seguinte.
Aqui está um diagrama simples que ilustra essa configuração (as células "XX" na grade representam itens pertencentes à área de memória 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 configuração permite Memory2D<T> ser extremamente flexível na forma como mapeia buffers existentes para áreas de memória 2D, pois torna possível também representar buffers descontíguos como um local de memória 2D "virtual". Por exemplo, aqui estão alguns exemplos de tipos de buffer para os quais uma Memory2D instância pode ser mapeada:
- Uma matriz 1D
T[]que é mapeada como uma área de memória 2D em ordem de linha maior. - Uma matriz 2D
T[,], mapeada diretamente para umaMemory2D<T>instância. - Uma matriz 3D
T[,,], com umaMemory2D<T>instância representando uma determinada fatia de profundidade (uma camada).
O Memory2D<T> tipo também expõe vários métodos de utilidade, incluindo a maior parte da mesma superfície de API que o padrão Memory<T> implementa. Por exemplo, ele inclui um Slice(int, int) método que facilita a realização de operações de fatiamento 2D diretamente no local da memória 2D virtual, com a Memory2D<T> instância ajustando automaticamente os parâmetros necessários internamente para deslocar seu mapeamento na(s) área(s) de memória correta(s) correspondente(s) ao resultado solicitado.
Sintaxe
Veja como você pode criar uma Memory2D<T> instância a partir de uma 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>
O ReadOnlyMemory2D<T> é para o tipo Memory2D<T> o que ReadOnlyMemory<T> é para Memory<T>. Ele expõe as mesmas funcionalidades exatas (menos as APIs que envolvem a modificação do conteúdo da área de memória encapsulada) e fornece uma visualização somente leitura para locais arbitrários de memória 2D. Para obter mais informações sobre como esse tipo funciona, consulte o parágrafo sobre o Memory2D<T> tipo acima.
Exemplos
Pode encontrar mais exemplos nos testes unitários
.NET Community Toolkit