Я считаю, что следующие две части кода должны быть эквивалентны:
// first example
string s = "Hello memmory";
ReadOnlyMemory<char> memory = s.AsMemory();
using (MemoryHandle pin = memory.Pin())
{
Span<char> span = new Span<char>(pin.Pointer, 1);
Console.WriteLine(span[0]);
}
// second example
ReadOnlySpan<char> span2 = memory.Span;
Console.WriteLine(span2[0]);
В обоих кодах будет напечатано "H".
Что я не понимаю, так это где открепление памяти во втором примере.
Насколько я понимаю, строка размещается в Heap, MemoryHandle
закрепляет ее и создает Span из указателя. MemoryHandle.Dispose
открепить память назад.
Я считаю, что memory.Span
также должен закрепить память, иначе span не сможет получить доступ к указателю. Но как открепить память во втором примере?