国产九色porn网址_亚洲综合伊人_91麻豆精品视频_免费吸乳羞羞网站视频

您好,微網(wǎng)歡迎您! 登錄  |  注冊(cè)
汕頭公司 |  深圳公司              咨詢熱線:400-830-8248               微網(wǎng)優(yōu)點(diǎn)  |  視頻介紹 |  服務(wù)支持
開店咨詢
咨詢電話:400-830-8248
微網(wǎng)商學(xué)院
中國(guó)第一微商學(xué)院
網(wǎng)絡(luò)商學(xué)院
首頁(yè) > 技術(shù)前沿
探討.NET中的聯(lián)合結(jié)構(gòu)
文章出處:微網(wǎng)  更新時(shí)間:2011-11-04  點(diǎn)擊率:
探討.NET中的聯(lián)合結(jié)構(gòu)

導(dǎo)讀:在進(jìn)行某些算法的C語(yǔ)言編程的時(shí)候,需要使幾種不同類型的變量存放到同一段內(nèi)存單元中。也就是使用覆蓋技術(shù),幾個(gè)變量互相覆蓋。這種幾個(gè)不同的變量共同占用一段內(nèi)存的結(jié)構(gòu),在C語(yǔ)言中,被稱作“共用體”類型結(jié)構(gòu),簡(jiǎn)稱共用體,也叫聯(lián)合體。

在C++中有一種類型叫做聯(lián)合體(也叫共用體),它的關(guān)鍵字為union,在使用上與結(jié)構(gòu)struct非常相似,可以包含任何的結(jié)構(gòu)類型數(shù)據(jù),但它又有一個(gè)非常獨(dú)特的特性,那就是所有的數(shù)據(jù)都指向一個(gè)地址。

這個(gè)意思你可以理解為:聯(lián)合體中的所有數(shù)據(jù)都是引用一個(gè)內(nèi)存塊中相同地址的數(shù)據(jù),當(dāng)我們改變這個(gè)聯(lián)合體內(nèi)任何一種數(shù)據(jù)的值時(shí),其他的數(shù)據(jù)的值都會(huì)隨之改變。

這對(duì)于未知類型的數(shù)據(jù)非常有效,你可以使用聯(lián)合體裝載一個(gè)數(shù)據(jù),然后分析其數(shù)據(jù)是否有效,或者可以對(duì)某些特殊的類型進(jìn)行位運(yùn)算,獲取其特殊位置的數(shù)值。

但在VB.NET或C#中,根本沒(méi)有union關(guān)鍵字讓我們聲名聯(lián)合體,但該怎么做才能聲名聯(lián)合體呢?

這需要用到結(jié)構(gòu)屬性!

讓我們看看如何將下面的C++聯(lián)合體代碼轉(zhuǎn)換為一個(gè)VB.NET的聯(lián)合結(jié)構(gòu)吧!

union myunion

{

char b; //單字節(jié)整數(shù),在c語(yǔ)言中用char類型來(lái)表示單字節(jié)整數(shù)

short s; //雙字節(jié)整數(shù)

int i; //四字節(jié)整數(shù)

這個(gè)聯(lián)合體大小為4個(gè)字節(jié),其各個(gè)數(shù)據(jù)分別表示為單字節(jié)、雙字節(jié)、四字節(jié)的整數(shù),在運(yùn)行期間其任何數(shù)據(jù)的改變都會(huì)影響其他數(shù)據(jù)。

Improts System.Runtime.InteropServices '引入運(yùn)行時(shí)非托管數(shù)據(jù)管理服務(wù) 

引入結(jié)構(gòu)屬性,精確控制結(jié)構(gòu)中元素的位置

 <StructLayout(LayoutKind.Explicit)> _

Structure MyUnion

' 設(shè)置字段的偏移值,設(shè)為0即可

<FieldOffset(0)> Dim b As Byte '單字節(jié)整數(shù)

<FieldOffset(0)> Dim s As Short '雙字節(jié)整數(shù)

<FieldOffset(0)> Dim i As Integer '四字節(jié)整數(shù)

End Structure

這就是在.NET中設(shè)置聯(lián)合結(jié)構(gòu)的方法,C#中于VB.NET中的設(shè)置方法雷同,這里就不做贅述了。

下面來(lái)介紹聯(lián)合體的特性應(yīng)用,就以上面我們剛才聲名的聯(lián)合體結(jié)構(gòu)為例,下面的代碼將為我們演示聯(lián)合體的特性:

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 

 

上面的代碼可以更直觀地顯示數(shù)據(jù)在內(nèi)存中的變化,每當(dāng)改變聯(lián)合數(shù)據(jù)時(shí),其他的數(shù)據(jù)也會(huì)隨著內(nèi)存的變化而變化。

當(dāng)然,使用聯(lián)合體也有限制,那就是.NET的聯(lián)合體只適用于值類型,無(wú)法應(yīng)用在引用類型和指針中,你無(wú)法設(shè)置字符串(String)或是數(shù)組進(jìn)入聯(lián)合類型,這一點(diǎn)需要非常的注意!

當(dāng)然,.NEt中的聯(lián)合結(jié)構(gòu)體并不只有上面的用法,你可以發(fā)揮自己的想象力,比如可以:

<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 

這個(gè)結(jié)構(gòu)可以獲取一個(gè)有或無(wú)符號(hào)的四個(gè)字節(jié)整數(shù)每一個(gè)字節(jié)的數(shù)據(jù),而不需要自己寫算法來(lái)分析了。

測(cè)試代碼:

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 

 

聲明:本網(wǎng)部份文章為轉(zhuǎn)載文章,在每篇文章底部有說(shuō)明,文章的觀點(diǎn)和立場(chǎng)僅代表作者個(gè)人立場(chǎng),不代表微網(wǎng)立場(chǎng),若是文章轉(zhuǎn)載中有侵范您的權(quán)益,請(qǐng)發(fā)郵件到 493149@qq.com或致電13922854199通知?jiǎng)h除,謝謝!

QQ咨詢  技術(shù)總監(jiān)  微網(wǎng)顧問(wèn)  陳經(jīng)理  渠道經(jīng)理  

免費(fèi)電話 免費(fèi)熱線:400-830-8248  

微信咨詢  

注冊(cè)開店

代理加盟

返回頂部