Czy istnieje C# równoważne do C typedef union? Co to jest odpowiednik następujących w C#?
typedef union byte_array
{
struct{byte byte1; byte byte2; byte byte3; byte byte4;};
struct{int int1; int int2;};
};byte_array
Czy istnieje C# równoważne do C typedef union? Co to jest odpowiednik następujących w C#?
typedef union byte_array
{
struct{byte byte1; byte byte2; byte byte3; byte byte4;};
struct{int int1; int int2;};
};byte_array
C# nie natywnie obsługuje pojęcie związków C/C++. Można jednak użyć atrybutów StructLayout (LayoutKind.Explicit) i FieldOffset, aby utworzyć równoważną funkcjonalność. Należy zauważyć, że działa to tylko dla typów pierwotnych, takich jak int i float.
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct byte_array
{
[FieldOffset(0)]
public byte byte1;
[FieldOffset(1)]
public byte byte2;
[FieldOffset(2)]
public byte byte3;
[FieldOffset(3)]
public byte byte4;
[FieldOffset(0)]
public short int1;
[FieldOffset(2)]
public short int2;
}
Korzystanie atrybut StructLayout
, to wygląda trochę tak:
[StructLayout(LayoutKind.Explicit, Pack=1)]
public struct ByteArrayUnion
{
#region Byte Fields union
[FieldOffset(0)]
public byte Byte1;
[FieldOffset(1)]
public byte Byte2;
[FieldOffset(2)]
public byte Byte3;
[FieldOffset(3)]
public byte Byte4;
#endregion
#region Int Field union
[FieldOffset(0)]
public int Int1;
[FieldOffset(4)]
public int Int2;
#endregion
}
Twoje pytanie nie precyzuje, co jest twoim celem. Jeśli szukasz danych do oszukania, 2 powyższe odpowiedzi są poprawne.
Jeśli nie, to po prostu zrobić:
class Foo
{
object bar;
public int Bar {get {return (int)bar; } }
...
}
Czy możesz rozwinąć tę odpowiedź, proszę? – Xonatron
Faktycznie, oprócz rodzimych prymitywnych typów, to również pracować dla wartości utworzonych przez użytkownika, definiowanych jako elemencie. Zobacz tutaj: http://stackoverflow.com/documentation/c%23/5626/how-to-use-c-sharp-structs-to-create-a-union-type-similar-to-c-unions#t = 201608241340099784116 –