在C#中的C语言联合

3
如何在C#中实现一个类似C语言的联合体?
我的具体情况如下:我想要一个包含两个字段的联合体,一个是Int128,另一个是Decimal。
由于这两种类型需要相同的内存空间(8字节),我想要将它们重新解释为另一种类型。
基本上,我想知道这个C语言联合体在C#中会是什么样子(我正在使用相应的C#类型)。
union Sample {
    Int128 Value1;
    Decimal Value2;
};

我会感到宽慰,如果有人有任何想法!

一个自定义类,具有实现https://stackoverflow.com/questions/40110062/in-c-is-it-possible-to-cast-a-byte-array-into-another-type-without-creating-a的getter和setter方法,也许可以实现吗? - undefined
谢谢,但那并不完全是我想要的。我想重新解释实际的内存类型,就像C语言中的联合体一样。 - undefined
1
这个回答解决了你的问题吗?C++中的联合在C#中的应用 - undefined
1个回答

6
你可以通过在C#中为希望具有联合行为的字段添加FieldOffset(0)属性来实现类似于C语言中的联合。与专用的联合类型不同,需要使用C#的结构体。整个结构体需要具有StructLayout(LayoutKind.Explicit)属性。
这意味着你希望通过自己显式控制结构体的布局,并通过给字段添加FieldOffset(0)属性,将两个字段放置在内存的同一位置,因此根据你访问的字段,内存将被重新解释为该字段的类型。
你的最终代码可能类似于以下内容:
[StructLayout(LayoutKind.Explicit)]
struct Sample
{
    [FieldOffset(0)]
    public decimal ValueDecimal;
    
    [FieldOffset(0)]
    public Int128 ValueInteger;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接