- 使用StructLayout指定字段在内存中的布局顺序
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结构体实例转换为字节数组,并输出每个字节的值。
- 使用StructLayout指定字段的偏移量
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共享同一内存空间,从而可以通过不同的字段访问同一内存位置的值。