Используем Memory для Эффективного Управления Памятью. Начало
В C# разработчики имеют доступ к мощному API Memory<T>, позволяющему гибко и эффективно работать с памятью.
Мы используем Span для безопасного предоставления непрерывной области памяти. Как и Span<T>, Memory<T> представляет собой непрерывную область памяти. Однако она может находиться в куче, а не только в стеке, как Span.
См. также «Различия Между Span и Memory в C#»
Создание Memory
var numbers = new int[] { 1, 2, 3, 4, 5 };
var memory = new Memory<int>(numbers);В примере выше memory ссылается на данные в куче, т.к. массивы в C# размещаются в куче.
Memory<T> и асинхронные методы
public static async Task
ProcessMemoryAsync(Memory<int> memory)
{
await Task.Delay(1000);
for (var i = 0; i < memory.Span.Length; i++)
{
var item = memory.Span[i];
Console.WriteLine(item);
}
}
Здесь мы имитируем асинхронную операцию с помощью Task.Delay(), а затем получаем доступ к данным в памяти с помощью memory.Span и выводим их на консоль. Это было бы невозможно с помощью Span<T>, поскольку мы не можем использовать Span<T> в асинхронном коде из-за того, что это ref struct.
Метод расширения AsMemory()
Метод расширения string.AsMemory() позволяет создавать объект Memory<char> из строки без копирования базовых данных. Это может быть полезно при передаче подстрок методам, которые принимают параметры Memory<T>, без дополнительных выделений памяти:
const string str = "Hello, World!";
var memory = str.AsMemory();
var slice = memory.Slice(7, 5);
Console.WriteLine(slice.ToString());
// World
Мы создаем Memory<char> из строки с помощью AsMemory(), делаем срез этого Memory<char>, чтобы получить новый Memory<char>, представляющий часть исходной строки. И выводим этот срез на консоль, преобразуя его в строку с помощью метода ToString().
Далее рассмотрим продвинутые методы управления памятью.
Окончание следует…
Источник: https://code-maze.com/csharp-using-memory/