C#中等同于C语言union的功能

5

重复问题: C++中的联合体在C#中的等价物

C#中是否有与C联合typedef相当的东西? 以下内容在C#中的等价物是什么?

typedef union byte_array
{
    struct{byte byte1; byte byte2; byte byte3; byte byte4;};
    struct{int int1; int int2;};
};byte_array
3个回答

7

C#不支持C/C++中union的概念。但是,您可以使用StructLayout(LayoutKind.Explicit)和FieldOffset属性来创建相同的功能。

请注意,这仅适用于像int和float这样的原始类型。

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit)]
struct byte_array
{
    [FieldOffset(0)]
    public byte byte1;

    [FieldOffset(1)]
    public byte byte2;

    [FieldOffset(2)]
    public byte byte3;

    [FieldOffset(3)]
    public byte byte4;

    [FieldOffset(0)]
    public short int1;

    [FieldOffset(2)]
    public short int2;
}

1
实际上,除了原生基本类型外,这也适用于用户创建的值,定义为结构体。请参见此处:http://stackoverflow.com/documentation/c%23/5626/how-to-use-c-sharp-structs-to-create-a-union-type-similar-to-c-unions#t=201608241340099784116 - Milton Hernandez
在Milton(他也是正确的)之前的评论中提到的文档目前可以在此处找到:https://sodocumentation.net/csharp/topic/5626/how-to-use-csharp-structs-to-create-a-union-type---similar-to-c-unions- - Maxim Paperno

1

使用StructLayout属性,代码看起来会像这样:

    [StructLayout(LayoutKind.Explicit, Pack=1)]
    public struct ByteArrayUnion
    {
        #region Byte Fields union

        [FieldOffset(0)]
        public byte Byte1;

        [FieldOffset(1)]
        public byte Byte2;

        [FieldOffset(2)]
        public byte Byte3;

        [FieldOffset(3)]
        public byte Byte4;

        #endregion

        #region Int Field union

        [FieldOffset(0)]
        public int Int1;

        [FieldOffset(4)]
        public int Int2;

        #endregion
    }

1

你的问题没有明确说明你的目的是什么。如果你想将数据编组到PInvoke中,那么上面的两个答案是正确的。

如果不是这样,那么你只需要:

class Foo
{
  object bar;
  public int Bar {get {return (int)bar; } }
  ...
}

请您能详细解释一下这个答案吗? - Xonatron

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