|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解)</p>导读:在举行某些算法的C言语编程的时分,必要使几种分歧范例的变量寄存到统一段内存单位中。也就是利用掩盖手艺,几个变量相互掩盖。这类几个分歧的变量配合占用一段内存的布局,在C言语中,被称作“共用体”范例布局,简称共用体,也叫团结体。
在C++中有一品种型叫做团结体(也叫共用体),它的关头字为union,在利用上与布局struct十分类似,能够包括任何的布局范例数据,但它又有一个十分共同的特征,那就是一切的数据都指向一个地点。
这个意义你能够了解为:团结体中的一切数据都是援用一个内存块中不异地点的数据,当我们改动这个团结体内任何一种数据的值时,其他的数据的值城市随之改动。
这关于未知范例的数据十分无效,你可使用团结体装载一个数据,然后剖析其数据是不是无效,大概能够对某些特别的范例举行位运算,猎取其特别地位的数值。
但在VB.NET或C#中,基本没有union关头字让我们申明团结体,但该怎样做才干申明团结体呢?
这必要用到布局属性!
让我们看看怎样将上面的C++团结体代码转换为一个VB.NET的团结布局吧!
- unionmyunion
- {
- charb;//单字节整数,在c言语顶用char范例来暗示单字节整数
- shorts;//双字节整数
- inti;//四字节整数
- }
这个团结体巨细为4个字节,其各个数据分离暗示为单字节、双字节、四字节的整数,在运转时代其任何数据的改动城市影响其他数据。
- ImprotsSystem.Runtime.InteropServices引进运转时非托管数据办理服务
引进布局属性,准确把持布局中元素的地位
- <StructLayout(LayoutKind.Explicit)>_
- StructureMyUnion
- 设置字段的偏移值,设为0便可
- <FieldOffset(0)>DimbAsByte单字节整数
- <FieldOffset(0)>DimsAsShort双字节整数
- <FieldOffset(0)>DimiAsInteger四字节整数
- EndStructure
这就是在.NET中设置团结布局的办法,C#中于VB.NET中的设置办法相同,这里就不做赘述了。
上面来先容团结体的特征使用,就以下面我们方才申明的团结体布局为例,上面的代码将为我们演示团结体的特征:
- DimMUAsNewMyUnion
- MsgBox(String.Format("{0}{1}{2}",MU.b,MU.s,MU.i))000
- MU.s=Int16.MaxValue
- MsgBox(String.Format("{0}{1}{2}",MU.b,MU.s,MU.i))2553276732767
- MU.b=12
- MsgBox(String.Format("{0}{1}{2}",MU.b,MU.s,MU.i))123252432524
- MU.i=0
- MsgBox(String.Format("{0}{1}{2}",MU.b,MU.s,MU.i))000
下面的代码能够更直不雅地显现数据在内存中的变更,每当改动团结数据时,其他的数据也会跟着内存的变更而变更。
固然,利用团结体也无限制,那就是.NET的团结体只合用于值范例,没法使用在援用范例和指针中,你没法设置字符串(String)或是数组进进团结范例,这一点必要十分的注重!
固然,.NEt中的团结布局体其实不只要下面的用法,你能够发扬本人的设想力,好比能够:
- <StructLayout(LayoutKind.Explicit)>_
- StructureMyUnion2
- <FieldOffset(0)>Dimb1AsByte
- <FieldOffset(1)>Dimb2AsByte
- <FieldOffset(2)>Dimb3AsByte
- <FieldOffset(3)>Dimb4AsByte
- <FieldOffset(0)>DimiAsInteger
- <FieldOffset(0)>DimuiAsUInteger
- EndStructure
这个布局能够猎取一个有或无标记的四个字节整数每个字节的数据,而不必要本人写算法来剖析了。
测试代码:
Code:
- DimMUAsMyUnion2
- 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)))0000
- 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)))FFFFFFFF
- MsgBox(MU.i&":"&MU.ui)-1:4294967295
有个问题想请教你一下,呵呵:)你觉得将来学什么方向比较好,我真是想不出来,知道的太少了,麻烦了。 |
|