Raccolta di howto, informazioni, consigli, trucchi e documentazione di varia utilità per ricordare tante cose utili

martedì 6 ottobre 2009

Il costrutto "union" in C#

Il linguaggio C ci fornisce il comodo costrutto union utile per esempio per convertire variabili o strutture di tipo diverso ma di eguale dimensione.
In C# il costrutto union non esiste, esistono al suo posto le classi StructLayoutAttribute e FieldOffsetAttribute entrambe appartenneti al namespace System.Runtime.InteropServices. La StructLayoutAttribute può essere applicata a dei costrutti di tipo class o struct mentre la FieldOffsetAttribute viene applicata ai membri della classe o struttura.
Supponendo di voler convertire un Int16 (intero a 16 bit) in due byte (8 bit) e viceversa possiamo utilizzare il seguente costrutto:

    [StructLayout(LayoutKind.Explicit, Size = 2)]
    struct U16B
    {
        [FieldOffset(0)]
        public byte B1;
        [FieldOffset(1)]
        public byte B2;
        [FieldOffset(0)]
        public Int16 I16;
    }

Questo crea una struttura con i cambi I16 e B1, B2 che condividono gli stessi 2 byte di memoria in maniera del tutto analoga alle union del C.
Anche l'uso è del tutto analogo.
Per convertire l'intero nei due byte che lo compongono si usa il seguente codice:

Int16 a = 12345;
byte[] b = new byte[2];
U16B u = new U16B();

u.I16 = a;
b[1] = u.B2;
b[0] = u.B1;

La documentazione di riferimento si può trovare qui:

Nessun commento: