Tipos relacionados a memória e extensão
Do .NET Core 2.1 em diante, o .NET inclui uma variedade de tipos interrelacionados que representam uma região contígua, fortemente tipada de memória arbitrária. Estão incluídos:
System.Span<T>, um tipo usado para acessar uma região contígua da memória. Uma instância Span<T> pode ser sustentada por uma matriz do tipo
T
, uma String, um buffer alocado com stackalloc ou um ponteiro para memória não gerenciada. Como ela deve ser alocada na pilha, tem várias restrições. Por exemplo, um campo em uma classe não pode ser do tipo Span<T>, nem a extensão pode ser usada em operações assíncronas.System.ReadOnlySpan<T>, uma versão imutável da estrutura Span<T>.
System.Memory<T>, um wrapper sobre uma região contígua de memória. Uma instância Memory<T> pode ser apoiada por uma matriz do tipo
T
ou um String, ou um gerenciador de memória. Como ela pode ser armazenada no heap gerenciado, Memory<T> não tem nenhuma das limitações de Span<T>.System.ReadOnlyMemory<T>, uma versão imutável da estrutura Memory<T>.
System.Buffers.MemoryPool<T>, que aloca blocos de memória fortemente tipados de um pool de memória para um proprietário. Instâncias IMemoryOwner<T> podem ser alocadas do pool chamando MemoryPool<T>.Rent e lançadas de volta ao pool chamando MemoryPool<T>.Dispose().
System.Buffers.IMemoryOwner<T>, que representa o proprietário de um bloco de memória e controla o gerenciamento do tempo de vida.
MemoryManager<T>, uma classe base abstrata que pode ser usada para substituir a implementação de Memory<T>, de modo que Memory<T> possa ser sustentada por tipos adicionais, como identificadores seguros. MemoryManager<T> destina-se a cenários avançados.
ArraySegment<T>, um wrapper para determinado número de elementos de matriz, começando em um índice específico.
System.MemoryExtensions, uma coleção de métodos de extensão para converter cadeias de caracteres, matrizes e segmentos de matriz para blocos Memory<T>.
System.Span<T>, System.Memory<T> e seus equivalentes somente leitura são projetados para permitir a criação de algoritmos que evitam copiar memória ou alocar no heap gerenciado mais do que o necessário. Criá-los (por meio de Slice
ou seus construtores) não envolve a duplicação dos buffers subjacentes: somente as referências e os deslocamentos relevantes, que representam a "exibição" da memória encapsulada, são atualizados.
Observação
Para estruturas anteriores, Span<T> e Memory<T> estão disponíveis no pacote do System.Memory NuGet.
Para obter mais informações, consulte o namespace de System.Buffers.
Como trabalhando com memória e extensão
Como os tipos relacionados a memória e extensão normalmente são usados para armazenar dados em um pipeline de processamento, é importante que os desenvolvedores sigam um conjunto de melhores práticas ao usar Span<T>, Memory<T> e tipos relacionados. Essas melhores práticas estão documentadas em Diretrizes de uso de Memória<T> e Extensão<T>.