我正在将用C ++编写的库转换为C#,并且关键字“联合”存在一次。在结构中。
将其转换为C#的正确方法是什么?它是做什么的?看起来像这样;
struct Foo {
float bar;
union {
int killroy;
float fubar;
} as;
}
我正在将用C ++编写的库转换为C#,并且关键字“联合”存在一次。在结构中。
将其转换为C#的正确方法是什么?它是做什么的?看起来像这样;
struct Foo {
float bar;
union {
int killroy;
float fubar;
} as;
}
Answers:
您可以为此使用显式字段布局:
[StructLayout(LayoutKind.Explicit)]
public struct SampleUnion
{
[FieldOffset(0)] public float bar;
[FieldOffset(4)] public int killroy;
[FieldOffset(4)] public float fubar;
}
未经测试。这个想法是两个变量在结构中的位置相同。当然,您只能使用其中之一。
有关结构教程的联合的更多信息
您不知道如何使用它就无法真正决定如何处理它。如果仅用于节省空间,则可以忽略它而仅使用结构。
但是,这通常不是为什么使用工会的原因。使用它们有两个常见原因。一种是提供两种或更多种访问同一数据的方式。例如,将int与4个字节的数组进行并集是(多种)分离32位整数字节的一种方法。
另一个是当结构中的数据来自外部源(例如网络数据包)时。通常,包含联合的结构的一个元素是ID,该ID告诉您联合的哪种样式有效。
在这两种情况下,您都不能盲目地忽略联合并将其转换为两个(或更多)字段不一致的结构。
在C / C ++中,并集用于在同一内存位置覆盖不同的成员,因此,如果您有一个int和float的并集,它们都使用相同的4个字节的内存来存储,显然写一个会破坏另一个(因为int和float具有不同的位布局)。
在.Net中,Microsoft选择了更安全的选择,但没有包含此功能。
编辑:互操作性除外
我个人将全部忽略UNION,并将Killroy和Fubar分别实现为单独的字段
public struct Foo
{
float bar;
int Kilroy;
float Fubar;
}
使用UNION可节省int分配的32位内存....这些天不会制作或破坏应用程序。