C实现一个类似C的Union

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;
}

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程