在C#中的C ++联盟

我正在将用C ++编写的库翻译成C#,而关键字'union'只存在一次。 在一个结构中。

把它翻译成C#的正确方法是什么? 它有什么作用? 它看起来像这样;

struct Foo { float bar; union { int killroy; float fubar; } as; } 

你可以使用显式的字段布局:

 [StructLayout(LayoutKind.Explicit)] public struct SampleUnion { [FieldOffset(0)] public float bar; [FieldOffset(4)] public int killroy; [FieldOffset(4)] public float fubar; } 

未经testing。 这个想法是两个variables在你的结构中有相同的位置。 你当然可以只使用其中的一个。

有关工程结构教程中的更多信息

如果不知道如何使用它,你无法确定如何处理这个问题。 如果仅仅是用来节省空间,那么你可以忽略它,只是使用一个结构。

但是,这通常不是为什么使用工会。 有两个常见的原因使用它们。 一种是提供两种或两种以上的方式来访问相同的数据。 例如,一个int和一个4字节的数组的联合是分离出一个32位整数字节的方法之一。

另一种是当结构中的数据来自外部来源,如networking数据包。 通常封闭联合的结构中的一个元素是一个ID,告诉你联合的哪个风格是有效的。

在这两种情况下,你都不能盲目地忽略联合,并把它转换成两个(或多个)字段不重合的结构。

在C / C ++中,union被用来覆盖同一个内存位置的不同成员,所以如果你有一个int和一个flat的联合,它们都使用相同的4个字节的内存,显然写入一个会损坏另一个(因为int和浮动有不同的位布局)。

在.net MS去与更安全的select,并没有包括这个function。

编辑:互操作除外

就我个人而言,我会一起忽略联盟,将Killroy和Fubar作为单独的领域实施

 public struct Foo { float bar; int Kilroy; float Fubar; } 

使用一个UNION可以节省由int分配的32位内存….这些日子不会制造或破坏应用程序。

如果你使用union来把一个types的字节映射到另一个types的字节,那么你可以使用BitConverter来代替。

 float fubar = 125f; int killroy = BitConverter.ToInt32(BitConverter.GetBytes(fubar), 0); 

要么;

 int killroy = 125; float fubar = BitConverter.ToSingle(BitConverter.GetBytes(killroy), 0);