windows8-如何在C#中实现C++风格的并集

本文关键字:风格 C++ 实现 windows8- | 更新日期: 2023-09-27 17:59:31

有没有办法在C#中实现C++风格的并集?我还需要将这个"联合"序列化到磁盘。

windows8-如何在C#中实现C++风格的并集

您可以使用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.

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

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

在这一点上,你真正需要问自己的问题是:你首先需要C型工会的确切原因是什么这个问题的答案可能会引导你进入下一个问题。。

C风格的并集解决了一个在C环境下有意义的问题,在C环境中,内存过去相当稀疏,类型系统也不是很严格,就像的情况一样。净

在C#中,你可以使用结构和属性来获得联合语义,但你应该仔细考虑你试图解决的潜在问题!

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

dynamic可以被认为在某种程度上接近并集,因为这种类型的变量可以容纳任何东西。

dynamic a = 3;
a = "test";