Здравствуйте, vdimas, Вы писали:
V>Случаев сразу несколько.
V>Раньше был доступен stackalloc только под примитивные blit-типы.
V>Например, делаешь byte * b = stackallock byte[N], затем приводишь к указателю на структуру.
На самом деле есть public fixed byte
https://stackoverflow.com/questions/13001327/id-like-to-use-union-as-c-sharp-with-byte-array
А из него можно уже десериализовать сериализовать объекты
ну и юнионы тоже
[StructLayout(LayoutKind.Explicit, Size = 12)]
public unsafe struct UnionPacket
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
[FieldOffset(0)]
public fixed byte data[12];
[FieldOffset(0)]
public float Time;
[FieldOffset(4)]
public Int16 CoordX;
[FieldOffset(6)]
public Int16 CoordY;
[FieldOffset(8)]
public byte Red;
[FieldOffset(9)]
public byte Green;
[FieldOffset(10)]
public byte Blue;
[FieldOffset(11)]
public byte Alpha;
}
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/unsafe-code
Кстати для интереса какая разница вызова localMultiply,Combine, UnsafeCombine и из натива
public static T Combine<T>(Func<T, T, T> combinator, T left, T right) =>
combinator(left, right);
public static T UnsafeCombine<T>(delegate*<T, T, T> combinator, T left, T right) =>
combinator(left, right);
static int localMultiply(int x, int y) => x * y;
int product = UnsafeCombine(&localMultiply, 3, 4);