新聞中心
在C++中有一種類型叫做聯合體(也叫共用體),它的關鍵字為union,在使用上與結構struct非常相似,可以包含任何的結構類型數據,但它又有一個非常獨特的特性,那就是所有的數據都指向一個地址。

棗莊網站制作公司哪家好,找創(chuàng)新互聯!從網頁設計、網站建設、微信開發(fā)、APP開發(fā)、自適應網站建設等網站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯于2013年開始到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創(chuàng)新互聯。
這個意思你可以理解為:聯合體中的所有數據都是引用一個內存塊中相同地址的數據,當我們改變這個聯合體內任何一種數據的值時,其他的數據的值都會隨之改變。
這對于未知類型的數據非常有效,你可以使用聯合體裝載一個數據,然后分析其數據是否有效,或者可以對某些特殊的類型進行位運算,獲取其特殊位置的數值。
但在VB.NET或C#中,根本沒有union關鍵字讓我們聲名聯合體,但該怎么做才能聲名聯合體呢?
這需要用到結構屬性!
讓我們看看如何將下面的C++聯合體代碼轉換為一個VB.NET的聯合結構吧!
- union myunion
- {
- char b; //單字節(jié)整數,在c語言中用char類型來表示單字節(jié)整數
- short s; //雙字節(jié)整數
- int i; //四字節(jié)整數
- }
這個聯合體大小為4個字節(jié),其各個數據分別表示為單字節(jié)、雙字節(jié)、四字節(jié)的整數,在運行期間其任何數據的改變都會影響其他數據。
- Improts System.Runtime.InteropServices '引入運行時非托管數據管理服務
引入結構屬性,精確控制結構中元素的位置
_ - Structure MyUnion
- ' 設置字段的偏移值,設為0即可
Dim b As Byte '單字節(jié)整數 Dim s As Short '雙字節(jié)整數 Dim i As Integer '四字節(jié)整數 - End Structure
這就是在.NET中設置聯合結構的方法,C#中于VB.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中的聯合結構體并不只有上面的用法,你可以發(fā)揮自己的想象力,比如可以:
_ - Structure MyUnion2
Dim b1 As Byte Dim b2 As Byte Dim b3 As Byte Dim b4 As Byte Dim i As Integer Dim ui As UInteger - End Structure
這個結構可以獲取一個有或無符號的四個字節(jié)整數每一個字節(jié)的數據,而不需要自己寫算法來分析了。
測試代碼:
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
當前題目:探討.NET中的聯合結構
分享網址:http://m.fisionsoft.com.cn/article/cooshpg.html


咨詢
建站咨詢
