C#中的C ++联合

时间:2020-03-06 14:39:28  来源:igfitidea点击:

我正在将用C ++编写的库转换为C#,并且关键字"联合"存在一次。在结构中。

将其转换为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;
}

未经测试。这个想法是两个变量在结构中具有相同的位置。当然,我们只能使用其中之一。

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

在C / C ++中,并集用于在同一内存位置覆盖不同的成员,因此,如果我们拥有一个int和float的并集,它们都使用相同的4个字节的内存来存储,显然写一个会破坏另一个int和float具有不同的位布局)。

在.Net中,Microsoft选择了更安全的选择,但没有包含此功能。

编辑:互操作性除外

我个人将全部忽略UNION,并将Killroy和Fubar分别实现为单独的字段

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

使用UNION可以节省int分配的32位内存....这些天不会制作或者破坏应用程序。

我们不知道如何使用它就无法真正决定如何处理它。如果仅用于节省空间,则可以忽略它而仅使用结构。

但是,这通常不是为什么使用工会的原因。有两个共同的原因来使用它们。一种是提供两种或者更多种访问同一数据的方式。例如,将int和4个字节组成的数组的并集是(多种)分离32位整数的字节的一种方法。

另一个是当结构中的数据来自外部源(例如网络数据包)时。通常,包含联合的结构的一个元素是ID,该ID告诉我们联合的哪种样式有效。

在这两种情况下,我们都不能盲目地忽略联合并将其转换为两个(或者更多)字段不一致的结构。