Для реализации сетевого протокола я хочу использовать новые классы Memory
и Span
для достижения нулевой копии буфера при доступе к данным через struct
.
У меня естьследующий надуманный пример:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Data
{
public int IntValue;
public short ShortValue;
public byte ByteValue;
}
static void Prepare()
{
var buffer = new byte[1024];
var dSpan = MemoryMarshal.Cast<byte, Data>(buffer);
ref var d = ref dSpan[0];
d.ByteValue = 1;
d.ShortValue = (2 << 8) + 3;
d.IntValue = (4 << 24) + (5 << 16) + (6 << 8) + 7;
}
В результате buffer
заполняется 7, 6, 5, 4, 3, 2, 1
, что по желанию, но я с трудом могу себе представить, что MemoryMarshal.Cast
- единственный способ (за исключением того, что требуетсяключевое слово unsafe
).Я попробовал некоторые другие методы, но я не могу понять, как использовать их с ref struct
(который не может использоваться в качестве аргумента универсального типа) или как получить структуру, которая находится в реальном буфере, а не в копии(при котором любые сделанные мутации не отражаются в буфере).
Есть ли какой-нибудь более простой способ получить эту изменяемую структуру из буфера?