Мне удалось поместить в одну область памяти стандарные типы:
- Код: Выделить всё
<StructLayout(LayoutKind.Explicit, pack:=1)> Class H1
<FieldOffset(0)> Public Int as Integer
<FieldOffset(0)> Public B1 as Byte
<FieldOffset(1)> Public B2 as Byte
<FieldOffset(2)> Public B3 as Byte
<FieldOffset(3)> Public B4 as Byte
End Class
Также это легко проделать с массивами (я так понимаю, у них просто ссылка на начальный элемент совпадает):
- Код: Выделить всё
<StructLayout(LayoutKind.Explicit, pack:=1)> Class H2
<FieldOffset(0)> Public Int() as Integer 'Можно написать int(1), но память и так выделится следующей строкой
<FieldOffset(0)> Public B(7) as Byte
End Class
Но можно ли объединить ссылочный и не ссылочный тип?
Нужно, чтобы Integer располагался там, где начинается байтовый массив.
Так, естественно, не работает:
- Код: Выделить всё
<StructLayout(LayoutKind.Explicit, pack:=1)> Class H
<FieldOffset(0)> Public Int as Integer
<FieldOffset(0)> Public B(3) as Byte
End Class
И так тоже:
- Код: Выделить всё
<StructLayout(LayoutKind.Explicit, pack:=1)> Class H
<FieldOffset(0)> Public Int as Integer
<FieldOffset(0)> <MarshalAs(UnmanagedType.ByValArray, sizeconst := 4> Public B(3) as Byte
End Class
Может можно это как-нибудь сделать?
p.s. Меня вполне устраивает вариант с массивами (если элемент в массиве один, для удобства можно задать доступ к нему через свойство).
Но вопрос всё-равно остаётся в силе, в целях повышения образованности.