| 屬性 | 用途 |
[StructLayout(LayoutKind.Sequential)] | 按聲明順序緊湊排列(默認),字段自動對齊 |
[StructLayout(LayoutKind.Explicit)] | 手動控制每個字段偏移,需配合 [FieldOffset] |
[FieldOffset(offset)] | 指定字段在結構體中的絕對字節偏移 |
[MarshalAs(UnmanagedType.xxx)] | 指定字段非托管表示形式(如字符串編碼、數組形式) |
Explicit 佈局示例:聯合體
[StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
[FieldOffset(0)] public int i;
[FieldOffset(0)] public double d;
[FieldOffset(0)] public char c;
[FieldOffset(0)] public byte b;
}
// 所有字段共享起始地址,類似 C union
Explicit 佈局示例:自定義偏移
[StructLayout(LayoutKind.Explicit)]
struct TestExplicit
{
[FieldOffset(0)] public long lg; // 0-7
[FieldOffset(0)] public int i1; // 0-3
[FieldOffset(4)] public int i2; // 4-7
[FieldOffset(8)] public double d; // 8-15
[FieldOffset(16)] public char c; // 16-17
[FieldOffset(18)] public byte b; // 18
}
Sequential 佈局(推薦大多數場景)
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct FontHeader
{
public uint Version; // 4
public ushort FontCount; // 2
public ushort Height; // 2
// Pack=1 禁用對齊填充,確保與文件格式完全一致
}
關鍵參數 Pack
- 控制字段對齊邊界(1, 2, 4, 8, 16)。
Pack=1 表示無填充,按順序緊湊排列,適合文件格式映射。
- 默認
Pack=0 跟隨平台(通常 8 字節對齊)。
後續預告
下一篇將展示完整的 Marshal 序列化/反序列化封裝、文件讀寫代碼、實測結構體與二進制文件映射案例。
- 上一篇文章: C# 文件流讀寫結構體(二):Marshal 序列化完整實現
- 下一篇文章: C# 類成員初始化順序(三):循環靜態依賴與結構體初始化
Copyright ©
程式碼之家 All Rights Reserved