首页 >旅游

站长探讨NET狆嘚联合结构

2019-01-31 04:42:04 | 来源: 旅游

15:23 来源:夜闻香的博客 :Googler【纠错】人评论

A-A+ 怎么开淘宝店 站优化方法 创业如何获得投资 小米note顶配版评测 LOL活动

导读:在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作共用体类型结构,简称共用体,也叫联合体。

在C++中有一种类型叫做联合体(也叫共用体),它的关键字为union,在使用上与结构struct非常相似,可以包含任何的结构类型数据,但它又有一个非常独特的特性,那就是所有的数据都指向一个地址。

这个意思你可以理解为:联合体中的所有数据都是引用一个内存块中相同地址的数据,当我们改变这个联合体内任何一种数据的值时,其他的数据的值都会随之改变。

这对于未知类型的数据非常有效,你可以使用联合体装载一个数据,然后分析其数据是否有效,或者可以对某些特殊的类型进行位运算,获取其特殊位置的数值。

但在或C#中,根本没有union关键字让我们声名联合体,但该怎么做才能声名联合体呢?

这需要用到结构属性!

让我们看看如何将下面的C++联合体代码转换为一个的联合结构吧!

unionmyunion { charb;//单字节整数,在c语言中用char类型来表示单字节整数 shorts;//双字节整数 inti;//四字节整数 } 这个联合体大小为4个字节,其各个数据分别表示为单字节、双字节、四字节的整数,在运行期间其任何数据的改变都会影响其他数据。

eropServices'引入运行时非托管数据管理服务 引入结构属性,精确控制结构中元素的位置

StructLayout(plicit)_ StructureMyUnion '设置字段的偏移值,设为0即可 FieldOffset(0)DimbAsByte'单字节整数 FieldOffset(0)DimsAsShort'双字节整数 FieldOffset(0)DimiAsInteger'四字节整数 EndStructure 这就是在.NET中设置联合结构的方法,C#中于中的设置方法雷同,这里就不做赘述了。

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

DimMUAsNewMyUnion MsgBox(rmat({0}{1}{2}U.i))'000 MU.s=xValue MsgBox(rmat({0}{1}{2}U.i))' MU.b=12 MsgBox(rmat({0}{1}{2}U.i))' MU.i=0 MsgBox(rmat({0}{1}{2}U.i))'000 上面的代码可以更直观地显示数据在内存中的变化,每当改变联合数据时,其他的数据也会随着内存的变化而变化。

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

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

StructLayout(plicit)_ 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:)'0:0 MsgBox(rmat({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(rmat({0}{1}{2}{3}Hex(MU.b1)Hex(MU.b2)Hex(MU.b3)Hex(MU.b4)))'FFFFFFFF MsgBox(MU.i:)'-1:

查看更多相似文章

深圳户口中介公司
棋牌游戏开发
串串香麻辣烫培训
专业高空防腐公司
南京音响专卖店
NFC9180泛光灯厂家

猜你喜欢