.NET 中的联合体
在C++中,有一种类型名为联合体(亦称共用体),关键字为
这个类型的好处,在于可以存储某种不确定的数据对象,等到稍后再来分析出该对象的用途。
当然不是,否则我干嘛写这篇文章?!
在 .net 中使用联合体,我们只需要声明一个普通的结构体,然后在结构体上使用属性描述即可。
下面再来看一看如何使用联合体!
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
要怎么用,就看你自己的脑洞啦~ 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。