通过使用属性可以自定义结构在内存中的布局方式。例如,可以使用 StructLayout(LayoutKind.Explicit) 和 FieldOffset 属性创建在 C/C++ 中称为联合的布局。
示例
在上一个代码段中,TestUnion
的所有字段都从内存中的同一位置开始。
C# | ![]() |
---|---|
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)] struct TestUnion { [System.Runtime.InteropServices.FieldOffset(0)] public int i; [System.Runtime.InteropServices.FieldOffset(0)] public double d; [System.Runtime.InteropServices.FieldOffset(0)] public char c; [System.Runtime.InteropServices.FieldOffset(0)] public byte b; } |
以下是字段从其他显式设置的位置开始的另一个示例。
C# | ![]() |
---|---|
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)] struct TestExplicit { [System.Runtime.InteropServices.FieldOffset(0)] public long lg; [System.Runtime.InteropServices.FieldOffset(0)] public int i1; [System.Runtime.InteropServices.FieldOffset(4)] public int i2; [System.Runtime.InteropServices.FieldOffset(8)] public double d; [System.Runtime.InteropServices.FieldOffset(12)] public char c; [System.Runtime.InteropServices.FieldOffset(14)] public byte b; } |
i1
和 i2
这两个 int 字段共享与 lg
相同的内存位置。使用平台调用时,这种结构布局控制很有用。
请参见
参考
使用属性(C# 编程指南)消除属性目标的歧义性(C# 编程指南)
创建自定义属性(C# 编程指南)
使用反射访问属性(C# 编程指南)
概念
C# 编程指南反射(C# 编程指南)
属性(C# 编程指南)