在C++中,有一种类型名为联合体(亦称共用体),关键字为union,它与结构十分类似,但是它所有的数值全都指向同一个指针。也就是说,当你修改联合体内的某一个数据时,其他数据也会同时改变。
这个类型的好处,在于可以存储某种不确定的数据对象,等到稍后再来分析出该对象的用途。
union MyUnion
{
    char b; //单字节整数,在c语言中用char类型来表示单字节整数
    short s; //双字节整数
    int i; //四字节整数
}
而在 .NET 中,却并没有 union 这个关键字,是不是 .NET 就无法使用联合体呢?
当然不是,否则我干嘛写这篇文章?!

在 .net 中使用联合体,我们只需要声明一个普通的结构体,然后在结构体上使用属性描述即可。
Imports System.Runtime.InteropServices '引入运行时非托管数据管理服务

' 引入结构属性,精确控制结构中元素的位置
<StructLayout(LayoutKind.Explicit)> _
Structure MyUnion
    ' 设置字段的偏移值,设为0即可
    <FieldOffset(0)> Dim b As Byte '单字节整数
    <FieldOffset(0)> Dim s As Short '双字节整数
    <FieldOffset(0)> Dim i As Integer '四字节整数
End Structure
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit)]
struct MyUnion {
    [FieldOffset(0)] byte b;
    [FieldOffset(0)] short s;
    [FieldOffset(0)] int i;
}
可以看出 .NET 中的联合体更强大,因为它甚至可以指定某个数值的偏移位置。

下面再来看一看如何使用联合体!
<StructLayout(LayoutKind.Explicit)> _
Structure MyUnion
    <FieldOffset(0)> Dim b0 As Byte
    <FieldOffset(1)> Dim b1 As Byte
    <FieldOffset(2)> Dim b2 As Byte
    <FieldOffset(3)> Dim b3 As Byte

    <FieldOffset(0)> Dim s As Short
    <FieldOffset(2)> Dim us As UShort

    <FieldOffset(0)> Dim i As Integer
    <FieldOffset(0)> Dim ui As UInteger
End Structure

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim mu As MyUnion

    ' 一种安全的int与uint转换方法
    mu.ui = UInteger.MaxValue
    MsgBox(mu.i) 'mu.i = -1

    ' 一个存储与读取IP数据的方法
    mu.b0 = 127 : mu.b1 = 0 : mu.b2 = 0 : mu.b3 = 1 '127.0.0.1
    Dim ip As New Net.IPAddress({127,0,0,1})
    MsgBox(CInt(ip.GetHashCode) = mu.i) 'ip数值相等

    ' 其他用法...
    mu.ui = UInteger.MaxValue
    MsgBox(mu.s) '-1
    MsgBox(mu.us) '65535

End Sub
要怎么用,就看你自己的脑洞啦~