熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

探討.NET中的聯合結構

2022-06-13   來源: .NET編程 

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

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

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

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

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

  這需要用到結構屬性!

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

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

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

  1. Improts SystemRuntimeInteropServices 引入運行時非托管數據管理服務 

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

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

  這就是在NET中設置聯合結構的方法C#中於VBNET中的設置方法雷同這裡就不做贅述了

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

  1. Dim MU As New MyUnion  
  2. MsgBox(StringFormat("{} {} {}" MUb MUs MUi))     
  3. MUs = IntMaxValue  
  4. MsgBox(StringFormat("{} {} {}" MUb MUs MUi))     
  5. MUb =   
  6. MsgBox(StringFormat("{} {} {}" MUb MUs MUi))     
  7. MUi =   
  8. MsgBox(StringFormat("{} {} {}" MUb MUs MUi))     

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

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

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

  1. <StructLayout(LayoutKindExplicit)> _  
  2. Structure MyUnion  
  3. <FieldOffset()> Dim b As Byte 
  4. <FieldOffset()> Dim b As Byte 
  5. <FieldOffset()> Dim b As Byte 
  6. <FieldOffset()> Dim b As Byte 
  7. <FieldOffset()> Dim i As Integer 
  8. <FieldOffset()> Dim ui As UInteger  
  9. End Structure  

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

  測試代碼

  Code

  1. Dim MU As MyUnion  
  2. MsgBox(MUi & " : " & MUui)  :   
  3. MsgBox(StringFormat("{} {} {} {}" Hex(MUb) Hex(MUb) Hex(MUb) Hex(MUb)))      
  4. MUb =  : MUb =  : MUb =  : MUb =   
  5. MsgBox(StringFormat("{} {} {} {}" Hex(MUb) Hex(MUb) Hex(MUb) Hex(MUb))) FF FF FF FF  
  6. MsgBox(MUi & " : " & MUui)  :  

From:http://tw.wingwit.com/Article/program/net/201311/14020.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.