C# 实现一个类似C的Union
问题描述
如何在C#中实现一个类似C的Union?
我的具体情况如下:我想要一个包含两个字段的Union,一个是 Int128
,一个是 Decimal
。
由于这两种类型需要相同的内存大小(8字节),我想要将它们重新解释为另一种类型。
实质上,我想知道这个C Union在C#中会是什么样子(我正在使用相应的C#类型):
union Sample {
Int128 Value1;
Decimal Value2;
};
如果有人有任何想法,我会感到宽慰!
解决方案
在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;
}