技术开发 频道

深入探讨.NET中的联合结构

  下面来介绍联合体的特性应用,就以上面我们刚才声名的联合体结构为例,下面的代码将为我们演示联合体的特性:

Dim MU As New MyUnion
MsgBox(String.Format("{0} {1} {2}", MU.b, MU.s, MU.i)) '0 0 0
MU.s = Int16.MaxValue
MsgBox(String.Format("{0} {1} {2}", MU.b, MU.s, MU.i)) '255 32767 32767
MU.b = 12
MsgBox(String.Format("{0} {1} {2}", MU.b, MU.s, MU.i)) '12 32524 32524
MU.i = 0
MsgBox(String.Format("{0} {1} {2}", MU.b, MU.s, MU.i)) '0 0 0

  上面的代码可以更直观地显示数据在内存中的变化,每当改变联合数据时,其他的数据也会随着内存的变化而变化。

  当然,使用联合体也有限制,那就是.NET的联合体只适用于值类型,无法应用在引用类型和指针中,你无法设置字符串(String)或是数组进入联合类型,这一点需要非常的注意!

  当然,.NEt中的联合结构体并不只有上面的用法,你可以发挥自己的想象力,比如可以:

<StructLayout(LayoutKind.Explicit)> _
Structure MyUnion2
    
<FieldOffset(0)> Dim b1 As Byte
    
<FieldOffset(1)> Dim b2 As Byte
    
<FieldOffset(2)> Dim b3 As Byte
    
<FieldOffset(3)> Dim b4 As Byte
    
<FieldOffset(0)> Dim i As Integer
    
<FieldOffset(0)> Dim ui As UInteger
End Structure

  这个结构可以获取一个有或无符号的四个字节整数每一个字节的数据,而不需要自己写算法来分析了。

  测试代码:

Code
Dim MU As MyUnion2
MsgBox(MU.i
& " : " & MU.ui) '0 : 0
MsgBox(String.Format("{0} {1} {2} {3}", Hex(MU.b1), Hex(MU.b2), Hex(MU.b3), Hex(MU.b4))) '0 0 0 0
MU.b1 = 255 : MU.b2 = 255 : MU.b3 = 255 : MU.b4 = 255
MsgBox(String.Format(
"{0} {1} {2} {3}", Hex(MU.b1), Hex(MU.b2), Hex(MU.b3), Hex(MU.b4))) 'FF FF FF FF
MsgBox(MU.i & " : " & MU.ui) '-1 : 4294967295
0
相关文章