2009-05-12 7 views
5

duplicati di C++ union in C#C# equivalenti a C unione

C'è un C# equivalente al typedef C unione? Qual è l'equivalente di quanto segue in C#?

typedef union byte_array 
{ 
    struct{byte byte1; byte byte2; byte byte3; byte byte4;}; 
    struct{int int1; int int2;}; 
};byte_array 

risposta

4

C# non supporta in modo nativo la nozione di unione C/C++. Tuttavia è possibile utilizzare gli attributi StructLayout (LayoutKind.Explicit) e FieldOffset per creare funzionalità equivalenti. Si noti che questo funziona solo per i tipi primitivi come int e 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

In realtà, a parte tipi primitivi nativi, questo sarebbe anche lavorare per i valori creati dagli utenti, definiti come strutture. Vedi qui: http://stackoverflow.com/documentation/c%23/5626/how-to-use-c-sharp-struct-to-create-a-union-type-similar-to-c-unions#t = 201608241340099784116 –

0

Utilizzando l'attributo StructLayout, sarebbe guardare un po 'come questo:

[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

La tua domanda non specifica che cosa il vostro scopo. Se stai cercando di eseguire il marshalling dei dati per eseguire il pushvoke, le 2 risposte precedenti sono corrette.

In caso contrario, il semplicemente fare:

class Foo 
{ 
    object bar; 
    public int Bar {get {return (int)bar; } } 
    ... 
} 
+0

Puoi approfondire questa risposta, per favore? – Xonatron