Logo UGIdotNET

Implementazione della Union in VB.NET

Una Union non è altro che una struttura nella quale due o più elementi si sovrappongono utilizzando nomi differenti o se si preferisce permette di riferirsi alla stessa locazione in memoria utilizzando nomi differenti. Questa funzionalità può essere implementata in VB.NET ricorrendo agli attributi StructLayoutAttribute e FieldOffsetAttribute del Namespace System.Runtime.InteropServices.

Il seguente codice mostra ad esempio come realizzare una Union che permetta di gestire un Int32 come un entità singola o come una doppia Word:

<System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Explicit)> _
Public Structure IntegerType

       <System.Runtime.InteropServices.FieldOffset(0)> _
       Private _doubleWord As System.Int32

       <System.Runtime.InteropServices.FieldOffset(0)> _
       Private _lowWord As System.Int16

       <System.Runtime.InteropServices.FieldOffset(2)> _
       Private _hightWord As System.Int16

       Function GetLowWord(ByVal value As System.Int32) As System.Int16
                Me._doubleWord = value
                Return Me._lowWord
       End Function

       Function GetHightWord(ByVal value As System.Int32) As System.Int16
                Me._doubleWord = value
                Return Me._hightWord
       End Function
End Structure

Come si può intuire le Union consentono di implementare routine di conversione complesse molto più efficienti rispetto agli operatori matematici standard.

Conclusioni

Bisognerebbe utilizzare questa tecnica solamente con tipi interi come Byte, Short, Integer e Long se si tenta di interpretare le locazioni come valori Single o Double spesso viene restituito il valore NaN (Not-a-Number).
Il tentativo di mappare un tipo di referimento (come una stringa) solleva un'eccezione in quanto il compilatore non accetta strutture nelle quali i tipi di riferimento si sovrappongono ad altri membri o non risultano allineate in modo opportuno.

Per una versione della Union in C# si faccia riferimento al seguente Tip Creare una union C-like in C#.

Autore: Ermanno Goletto
Data: 28 gennaio 2004
Ultimo aggiornamento: 23 luglio 2004
Categorie: 

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185