Поделиться через


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

.NET включает ряд взаимосвязанных типов, представляющих непрерывный, строго типизированный регион произвольной памяти. Эти типы предназначены для создания алгоритмов, которые не позволяют копировать память или выделять в управляемой куче больше, чем необходимо. Создание их (либо с помощью Slice, AsSpan(), выражения коллекции или их конструкторов) не требует дублирования базовых буферов: обновляются только соответствующие ссылки и смещения, представляющие "вид" обертки памяти. В коде с высокой производительностью диапазоны часто используются, чтобы избежать ненужных выделений строк.

К ним относятся следующие типы:

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

  • System.ReadOnlySpan<T>, неизменяемая версия Span<T> структуры. Экземпляры также могут быть подкреплены String.

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

  • System.ReadOnlyMemory<T>, неизменяемая версия Memory<T> структуры. Экземпляры также могут быть подкреплены String.

  • 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.Buffers пространстве имен.

Работа с памятью и диапазоном

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

См. также