2009-05-12 13 views
5

Duplikat C++ union in C#C# równoważne do C Unii

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 

Odpowiedz

4

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; 
} 
+0

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 –

0

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 
    } 
1

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; } } 
    ... 
} 
+0

Czy możesz rozwinąć tę odpowiedź, proszę? – Xonatron