如何在C#中实现C ++样式的Union?

时间:2013-02-15 01:32:15

标签: c# windows-8 windows-runtime

有没有办法在C#中实现C ++样式的Union?我还需要将这个“Union”序列化为磁盘。

4 个答案:

答案 0 :(得分:4)

没有办法在C#中实现C风格的联合,但你可以实现具有Union语义的东西。

此时你真正要问自己的问题是:首先你需要一个C风格联盟的原因究竟是什么?这个问题的答案可能会引导你你的下一个问题..

C风格的工会解决了一个在C语境中有意义的问题,其中内存过于稀疏且类型系统不是很严格,就像.NET的情况一样

在C#中你可以使用struct和attributes来获得union语义,但是你应该仔细考虑你想要解决的潜在问题!

答案 1 :(得分:4)

您可以使用StructLayoutAttributeFieldOffsetAttribute

对其进行模拟
[StructLayout(LayoutKind.Explicit)]
struct ExampleStruct
{
    [FieldOffset(0)]
    public int a;

    [FieldOffset(0)]
    public int b;

    [FieldOffset(0)]
    public int c;

    [FieldOffset(0)]
    public int d;
}

C#没有对它们的直接支持..但这会让你更接近。请参阅此MSDN示例:http://msdn.microsoft.com/en-us/library/acxa5b99(v=vs.80).aspx

关于你如何序列化它...我自己没有尝试过(没有必要......)。

答案 2 :(得分:2)

using System;
using System.Runtime.InteropServices;

namespace ipv4
{

    [StructLayout(LayoutKind.Explicit)]
    struct IPv4Address
    {
        [FieldOffset(0)]
        public uint Address;
        [FieldOffset(0)]
        public byte b3;
        [FieldOffset(1)]
        public byte b2;
        [FieldOffset(2)]
        public byte b1;
        [FieldOffset(3)]
        public byte b0;
    }

    class MainClass
    {
        public static void Main(string[] args)
        {
            IPv4Address myAddress;

            // Assign localhost to the IPv4 address
            myAddress.Address = 0; // Avoid CS0170: Unassigned Field error
            myAddress.b0 = 127;
            myAddress.b1 = 0;
            myAddress.b2 = 0;
            myAddress.b3 = 1;

            Console.WriteLine("The address in hexadecimal: {0:x}",myAddress.Address);
        }
    }
}

答案 3 :(得分:1)

dynamic可以被认为与联盟有点接近,因为这种类型的变量可以容纳任何东西。

dynamic a = 3;
a = "test";