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#.