C#相当于C union

时间:2009-05-12 12:15:11

标签: c# c unions

  

重复   C++ union in C#

是否有C#等效于C union typedef? C#中的以下等价物是什么?

typedef union byte_array
{
    struct{byte byte1; byte byte2; byte byte3; byte byte4;};
    struct{int int1; int int2;};
};byte_array

3 个答案:

答案 0 :(得分:4)

C#本身并不支持C / C ++联盟的概念。但是,您可以使用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 :(得分: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
    }

答案 2 :(得分:1)

您的问题没有说明您的目的是什么。如果您希望将数据编组为pinvoke,则上述2个答案是正确的。

如果没有,你只需:

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