2009-05-12 10 views
5

duplicados de C++ union in C#C# equivalentes a la unión C

¿Hay un equivalente C# con el typedef C sindicato? ¿Cuál es el equivalente de lo siguiente en C#?

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

Respuesta

4

C# no soporta de forma nativa la noción de C/C++ de los sindicatos. Sin embargo, puede utilizar los atributos StructLayout (LayoutKind.Explicit) y FieldOffset para crear una funcionalidad equivalente. Tenga en cuenta que esto funciona solo para tipos primitivos como int y 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

En realidad, aparte de los tipos primitivos nativos, esto también funciona para los valores creados por el usuario, definidos como estructuras. Vea aquí: 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

Usando el atributo StructLayout, se vería un poco como esto:

[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

Su pregunta no especifica cuál es su propósito. Si está buscando ordenar los datos para pinvoke, las 2 respuestas anteriores son correctas.

Si no, el sólo tiene que hacer:

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

¿Puede dar más detalles sobre esta respuesta, por favor? – Xonatron

Cuestiones relacionadas