有没有办法在C#中实现C ++样式的Union?我还需要将这个“Union”序列化为磁盘。
答案 0 :(得分:4)
没有办法在C#中实现C风格的联合,但你可以实现具有Union语义的东西。
此时你真正要问自己的问题是:首先你需要一个C风格联盟的原因究竟是什么?这个问题的答案可能会引导你你的下一个问题..
C风格的工会解决了一个在C语境中有意义的问题,其中内存过于稀疏且类型系统不是很严格,就像.NET的情况一样
在C#中你可以使用struct和attributes来获得union语义,但是你应该仔细考虑你想要解决的潜在问题!
答案 1 :(得分:4)
您可以使用StructLayoutAttribute
和FieldOffsetAttribute
:
[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";