Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
.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>.