using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
struct Point
{
public int x;
public int y;
}
class Program
{
static void Main()
{
Point p = new Point();
p.x = 10;
p.y = 20;
byte[] buffer = new byte[Marshal.SizeOf(p)];
IntPtr ptr = Marshal.AllocHGlobal(buffer.Length);
Marshal.StructureToPtr(p, ptr, false);
Marshal.Copy(ptr, buffer, 0, buffer.Length);
foreach (byte b in buffer)
{
Console.Write($"{b} ");
}
Marshal.FreeHGlobal(ptr);
}
}
在上面的示例中,通過使用StructLayout(LayoutKind.Sequential)指定Point結構體中字段的布局順序為按順序排列。然后將Point結構體實例轉換為字節數組,并輸出每個字節的值。
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct Union
{
[FieldOffset(0)]
public byte b1;
[FieldOffset(1)]
public byte b2;
[FieldOffset(0)]
public short s1;
}
class Program
{
static void Main()
{
Union u = new Union();
u.s1 = 257;
Console.WriteLine(u.b1); // 輸出1
Console.WriteLine(u.b2); // 輸出1
}
}
在上面的示例中,通過使用StructLayout(LayoutKind.Explicit)指定Union結構體中字段的布局方式為顯式布局。然后使用FieldOffset指定了字段的偏移量,使得b1和b2共享同一內存空間,從而可以通過不同的字段訪問同一內存位置的值。