有没有办法在 C# 中实现 C++ 风格的联合?我还需要将此“联合”序列化到磁盘。
user1211925
问问题
389 次
4 回答
4
您可以使用 and 模拟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 。
至于你将如何序列化它..我自己没有尝试过(没有必要..)。
于 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 回答