1

有没有办法在 C# 中实现 C++ 风格的联合?我还需要将此“联合”序列化到磁盘。

4

4 回答 4

4

您可以使用 and 模拟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 。

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

于 2013-02-15T01:38:04.353 回答
4

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

在这一点上你真正要问自己的问题是:你首先需要一个 C 风格的联合的确切原因是什么?该问题的答案可能会引导您进入下一个问题。

C 风格的联合解决了一个在 C 上下文中有意义的问题,其中内存过去相当稀疏,类型系统不是很严格,就像 .NET 的情况一样

在 C# 中,您可以使用结构和属性来获取联合语义,但您应该认真考虑您要解决的潜在问题!

于 2013-02-15T01:35:54.940 回答
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);
        }
    }
}
于 2013-02-15T01:38:51.127 回答
1

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

dynamic a = 3;
a = "test";
于 2013-02-15T01:39:56.103 回答