成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

探討.NET中的聯合結構

開發 后端
在進行某些算法的C語言編程的時候,需要使幾種不同類型的變量存放到同一段內存單元中。也就是使用覆蓋技術,幾個變量互相覆蓋。這種幾個不同的變量共同占用一段內存的結構,在C語言中,被稱作“共用體”類型結構,簡稱共用體,也叫聯合體。

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

這個意思你可以理解為:聯合體中的所有數據都是引用一個內存塊中相同地址的數據,當我們改變這個聯合體內任何一種數據的值時,其他的數據的值都會隨之改變。

這對于未知類型的數據非常有效,你可以使用聯合體裝載一個數據,然后分析其數據是否有效,或者可以對某些特殊的類型進行位運算,獲取其特殊位置的數值。

但在VB.NET或C#中,根本沒有union關鍵字讓我們聲名聯合體,但該怎么做才能聲名聯合體呢?

這需要用到結構屬性!

讓我們看看如何將下面的C++聯合體代碼轉換為一個VB.NET的聯合結構吧!

  1. union myunion  
  2. {  
  3. char b; //單字節整數,在c語言中用char類型來表示單字節整數  
  4. short s; //雙字節整數  
  5. int i; //四字節整數  
  6. }  

這個聯合體大小為4個字節,其各個數據分別表示為單字節、雙字節、四字節的整數,在運行期間其任何數據的改變都會影響其他數據。

  1. Improts System.Runtime.InteropServices '引入運行時非托管數據管理服務 

引入結構屬性,精確控制結構中元素的位置

  1. <StructLayout(LayoutKind.Explicit)> _  
  2. Structure MyUnion  
  3. ' 設置字段的偏移值,設為0即可  
  4. <FieldOffset(0)> Dim b As Byte '單字節整數  
  5. <FieldOffset(0)> Dim s As Short '雙字節整數  
  6. <FieldOffset(0)> Dim i As Integer '四字節整數  
  7. End Structure  

這就是在.NET中設置聯合結構的方法,C#中于VB.NET中的設置方法雷同,這里就不做贅述了。

下面來介紹聯合體的特性應用,就以上面我們剛才聲名的聯合體結構為例,下面的代碼將為我們演示聯合體的特性:

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

上面的代碼可以更直觀地顯示數據在內存中的變化,每當改變聯合數據時,其他的數據也會隨著內存的變化而變化。

當然,使用聯合體也有限制,那就是.NET的聯合體只適用于值類型,無法應用在引用類型和指針中,你無法設置字符串(String)或是數組進入聯合類型,這一點需要非常的注意!

當然,.NEt中的聯合結構體并不只有上面的用法,你可以發揮自己的想象力,比如可以:

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

這個結構可以獲取一個有或無符號的四個字節整數每一個字節的數據,而不需要自己寫算法來分析了。

測試代碼:

Code:

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

【編輯推薦】

  1. 深入C# 序列化(Serialize)、反序列化(Deserialize)
  2. C#初學者對Equals方法的幾個常見誤解
  3. 詳談C#和.NET中的類型轉換
  4. C#中自增、自減操作符重載是個怎么回事兒
  5. C#中的閉包是怎么捕獲變量的
責任編輯:于鐵 來源: IT168網站
相關推薦

2011-07-12 09:18:50

.NET

2010-06-18 09:23:33

SortedSet.NET 4

2009-07-28 09:42:22

.NET數據訪問層

2010-07-12 09:07:30

C#

2011-03-16 08:59:29

.NET強名稱

2009-08-13 16:57:37

.NET緩存機制

2010-09-08 09:49:28

藍牙協議棧

2009-03-13 09:31:03

.NET整合分布式應用

2009-05-11 13:48:00

ASP.NET 2.0緩存效率

2010-01-19 18:24:29

VB.NET調用Win

2010-04-16 16:41:53

rownum用法

2009-07-30 13:07:49

ASP.NET中的三層

2024-01-26 06:42:05

Redis數據結構

2009-11-04 11:32:20

VB.NET回調函數

2009-10-30 16:31:55

VB.NET重載方法

2022-01-12 08:30:55

結構體指針STM32

2010-02-01 10:30:13

Python世界

2020-05-08 16:09:23

索引B+樹存儲

2009-12-28 15:11:36

ADO.NET專家

2009-07-30 13:30:56

ASP.NET開發模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区五区在线视频 | av中文网 | 日韩精品在线一区 | 视频一区二区在线观看 | 国产一区二区三区网站 | 中文字幕一区二区三区精彩视频 | av在线免费观看网站 | 国产91九色 | 中文字幕在线电影观看 | 色资源在线| 精精国产xxxx视频在线野外 | 日韩av在线一区二区三区 | 欧美日韩电影免费观看 | 欧美一区二区在线播放 | 91久久精品日日躁夜夜躁欧美 | 中国91av| 国产一区二区三区免费 | 99精品网 | 日韩av一区二区在线观看 | 国产偷自视频区视频 | 欧美午夜一区 | 久久久欧洲 | 黄网站免费在线看 | 免费在线观看成人 | 午夜视频一区 | 欧美在线视频二区 | 91色站 | www国产成人免费观看视频 | 国偷自产av一区二区三区 | 日日干日日色 | 亚洲一区中文字幕在线观看 | av片毛片 | 亚洲九色 | 北条麻妃视频在线观看 | 久久av一区 | 天天色图 | 久久久五月天 | 黄色一级大片在线免费看产 | 激情五月综合 | 日本黄色影片在线观看 | 亚洲成人播放器 |