自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一見鐘情VB.NET指針

開發(fā) 后端
這里介紹VB.NET指針,在.NET中,對指針指向數(shù)據(jù)的存儲函數(shù)都封裝在marshal類中,主要的函數(shù)包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等。

VB.NET有很多值得學(xué)習(xí)的地方,這里我們主要介紹VB.NET指針,包括介紹NET垃圾回收器等方面,欲知VB.NET如何。以下程序我們申請幾個指向不同類型的VB.NET指針:

  1. '使用<StructLayout(LayoutKind.Sequential)>屬性告訴net編譯器:結(jié)構(gòu)的元素在內(nèi)存中按其出現(xiàn)的順序排列  
  2. <StructLayout(LayoutKind.Sequential)> _  
  3. Public Structure DEFUDT_Test  
  4. Public bytb As Byte  
  5. Public i32a As Int32  
  6. End Structure  
  7.  
  8. Public Function fnGetIntptr1() As IntPtr  
  9. '取得一個4字節(jié)數(shù)組指針  
  10. Dim tabytTest(3) As Byte  
  11. '以下語句告訴net垃圾回收進程不對tabytTest進行處理,也就是說tabytTest占用的內(nèi)存區(qū)域固定不變。  
  12. Dim thObject As GCHandleGCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)  
  13. Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() '取得指向字節(jié)數(shù)組的指針  
  14.  
  15. '取得一個指向32位內(nèi)存數(shù)據(jù)的指針,  
  16. '由于使用gchandle取指針的方法只能對引用的對象有效,  
  17. '所以對如int32等值類型必須使用將其封裝成為一個對象的方法以變?yōu)橐妙愋? 
  18. Dim ti32Test As Object = Convert.ToInt32(0)  
  19. '以下語句告訴net垃圾回收進程不對ti32test進行處理,也就是說ti32Test的內(nèi)存位置固定不變。  
  20. Dim thObject1 As GCHandleGCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)  
  21. Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() '取得ti32Test的首地址  
  22.  
  23. Dim tudtTest1 As DEFUDT_Test  
  24. '由于結(jié)構(gòu)是一種值類型變量,為保證指針申請方便,我們申請  
  25. '取得一個和結(jié)構(gòu)tudtTest1大小一致的字節(jié)數(shù)組指針,只要空間占用長度和結(jié)構(gòu)一樣就可以了  
  26. '由于net在結(jié)構(gòu)封裝中會插入額外的數(shù)據(jù)位,所以一定要用sizeof方法得到結(jié)構(gòu)在非托管使用時的實際大小  
  27. Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte  
  28. Dim thObject2 As GCHandleGCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)  
  29. Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() '取得指向結(jié)構(gòu)的指針  
  30.  
  31. '在這兒你可以寫對指針處理的任意代碼(在例2中會給予補充)……  
  32.  
  33. '在使用完畢后一定要釋放指針指向的內(nèi)存塊,讓垃圾回收器可對這個內(nèi)存塊回收處理  
  34. If thObject.IsAllocated Then  
  35. thObject.Free()  
  36. End If  
  37. If thObject1.IsAllocated Then  
  38. thObject1.Free()  
  39. End If  
  40. If thObject2.IsAllocated Then  
  41. thObject2.Free()  
  42. End If  
  43. End Function 

上例中VB.NET指針流程處理可以歸納為:
1、定義一個具有合適內(nèi)存長度的引用變量(關(guān)于引用變量和值變量的差異可以參觀VB.NET的書籍)
2、使用GCHandle.Alloc方法將變量的內(nèi)存區(qū)域固定下來。
3、使用GCHandle對象的AddrOfPinnedObject取得該內(nèi)存區(qū)域的首地址并賦值給指針變量.
4、對指針進行操作
5、使用GCHandle對象的free方法釋放指針指向的內(nèi)存區(qū)域以便NET垃圾回收器可以回收這個內(nèi)存空間
6、VB.NET指針?biāo)赶驍?shù)據(jù)的存取

在.NET中,對指針指向數(shù)據(jù)的存儲函數(shù)都封裝在marshal類中,主要的函數(shù)包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指針?biāo)硎镜牡刂分袑懭隭XX類型的數(shù)據(jù),而ReadXXX中作用就是將VB.NET指針?biāo)诘刂返臄?shù)據(jù)以XXX類型方式讀出。

【編輯推薦】

  1. 簡單描述VB.NET ProcessStartInfo對象
  2. VB.NET System.IO老鳥經(jīng)驗談
  3. 分析VB.NET創(chuàng)建類的具體操作過程
  4. 快速了解VB.NET垃圾收集器
  5. 對VB.NET OBEX協(xié)議的簡單概括
責(zé)任編輯:佚名 來源: IT168
相關(guān)推薦

2009-10-28 13:35:25

VB.NET On E

2020-04-24 08:48:22

面試求職面試官

2013-07-25 13:33:58

2012-12-27 16:23:25

簡歷應(yīng)屆畢業(yè)生

2015-05-07 14:26:50

APM透視寶云智慧

2015-12-11 11:31:41

apm企業(yè)

2009-06-18 08:17:14

百度李彥宏馬東敏

2009-11-10 16:46:52

VB.NET指針應(yīng)用

2009-10-14 15:20:21

VB.NET窗體指針

2009-10-27 09:01:54

VB.NET內(nèi)存指針

2009-11-10 16:27:45

VB.NET指針

2010-01-14 10:35:34

VB.NET指針

2009-10-29 14:02:24

VB和VB.NET比較

2011-06-17 11:05:22

VB.NET

2009-06-24 15:45:32

VB.NET

2009-10-20 14:21:55

VB.NET fnSi

2009-10-14 12:51:41

VB.NET Data

2010-01-07 16:40:13

VB.NET一維數(shù)組

2009-11-02 17:12:01

VB和VB.NET

2010-01-13 10:53:24

VB.NET控件
點贊
收藏

51CTO技術(shù)棧公眾號