Типы, связанные с памятью и диапазонами

Начиная с .NET Core 2.1, .NET включает ряд взаимосвязанных типов, представляющих непрерывную область строго типизированной произвольной памяти. Сюда входит следующее.

  • System.Span<T> — тип, используемый для доступа к непрерывной области памяти. В основе экземпляра Span<T> может быть массив типа T, String, буфер, выделенный с помощью stackalloc, или указатель на неуправляемую память. Так как выделение выполняется в стеке, существует ряд ограничений. Например, поле в классе не может иметь тип Span<T>, а диапазон нельзя использовать в асинхронных операциях.

  • System.ReadOnlySpan<T> — неизменяемая версия структуры Span<T>.

  • System.Memory<T> — программа-оболочка для непрерывной области памяти. В основе экземпляра Memory<T> может быть массив объектов типа T, String или диспетчер памяти. Так как он может храниться в управляемой куче, Memory<T> не имеет ограничений, применимых к Span<T>.

  • System.ReadOnlyMemory<T> — неизменяемая версия структуры Memory<T>.

  • System.Buffers.MemoryPool<T> — выделяет строго типизированные блоки памяти из пула памяти для владельца. Экземпляры IMemoryOwner<T> можно арендовать из пула путем вызова MemoryPool<T>.Rent, и освобождать в пул путем вызова MemoryPool<T>.Dispose().

  • System.Buffers.IMemoryOwner<T> — представляет владельца блока памяти и управляет временем ее существования.

  • MemoryManager<T> — абстрактный базовый класс, используемый для замены реализации Memory<T>, чтобы включить для Memory<T> поддержку дополнительных типов, включая безопасные дескрипторы. MemoryManager<T> — используется только в сложных сценариях.

  • ArraySegment<T> — программа-оболочка для определенного числа элементов массива, начиная с определенного индекса.

  • System.MemoryExtensions — коллекция методов расширения для преобразования строк, массивов и фрагментов массивов для блоков Memory<T>.

System.Span<T>, System.Memory<T> и их аналоги с доступом только на чтение предназначены для создания алгоритмов, позволяющих избежать копирования участков памяти или чрезмерного выделения памяти в управляемой куче. Их создание (с помощью Slice или их конструкторов) не предусматривает дублирование базовых буферов: обновляются только соответствующие ссылки и смещения, которые выполняют роль "представления" памяти в оболочке.

Примечание

Для более ранних платформ Span<T> и Memory<T> доступны в пакете System.Memory NuGet.

Дополнительные сведения см. в описании пространства имен System.Buffers.

Использование памяти и диапазонов

Так как типы, связанные с памятью и диапазонами, обычно используются для хранения данных в конвейере обработки, очень важно, чтобы разработчики следовали набору рекомендаций при использовании Span<T>, Memory<T> и связанных типов. Эти рекомендации описаны в рекомендациях по использованию MemoryT<> и SpanT<>.

См. также раздел