C#でC ++スタイルのUnionを実装する方法はありますか?また、この「ユニオン」をディスクにシリアル化する必要があります。
4 に答える
C#でCスタイルのユニオンを実装する方法はありませんが、ユニオンセマンティクスを持つものを実装することはできます。
この時点で本当に自問しなければならない質問は、そもそもCスタイルのユニオンが必要な理由は何ですか。そして、その質問への答えはおそらくあなたをあなたの次の質問に導くでしょう。
Cスタイルのユニオンは、.NETの場合のように、メモリがかなりスパースで、型システムがそれほど厳密ではなかったCのコンテキストで意味のある問題を解決しました。
C#では、構造体と属性を使用してユニオンセマンティクスを取得できますが、解決しようとしている根本的な問題を慎重に検討する必要があります。
あなたはそれをとでシミュレートすることができ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 。
どのようにシリアル化するかについては、自分で試したことはありません(必要はありませんでした)。
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";