一见钟情VB.NET指针

VB.NET有很多值得学习的地方,这里我们主要介绍VB.NET指针,包括介绍NET垃圾回收器等方面,欲知VB.NET如何。以下程序我们申请几个指向不同类型的VB.NET指针:

创新互联专注于山丹网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供山丹营销型网站建设,山丹网站制作、山丹网页设计、山丹网站官网定制、小程序开发服务,打造山丹网络公司原创品牌,更为您提供山丹网站排名全网营销落地服务。

 
 
 
  1. '使用(LayoutKind.Sequential)>属性告诉net编译器:结构的元素在内存中按其出现的顺序排列  
  2. (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字节数组指针  
  10. Dim tabytTest(3) As Byte  
  11. '以下语句告诉net垃圾回收进程不对tabytTest进行处理,也就是说tabytTest占用的内存区域固定不变。  
  12. Dim thObject As GCHandleGCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)  
  13. Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() '取得指向字节数组的指针  
  14.  
  15. '取得一个指向32位内存数据的指针,  
  16. '由于使用gchandle取指针的方法只能对引用的对象有效,  
  17. '所以对如int32等值类型必须使用将其封装成为一个对象的方法以变为引用类型  
  18. Dim ti32Test As Object = Convert.ToInt32(0)  
  19. '以下语句告诉net垃圾回收进程不对ti32test进行处理,也就是说ti32Test的内存位置固定不变。  
  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. '由于结构是一种值类型变量,为保证指针申请方便,我们申请  
  25. '取得一个和结构tudtTest1大小一致的字节数组指针,只要空间占用长度和结构一样就可以了  
  26. '由于net在结构封装中会插入额外的数据位,所以一定要用sizeof方法得到结构在非托管使用时的实际大小  
  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() '取得指向结构的指针  
  30.  
  31. '在这儿你可以写对指针处理的任意代码(在例2中会给予补充)……  
  32.  
  33. '在使用完毕后一定要释放指针指向的内存块,让垃圾回收器可对这个内存块回收处理  
  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、定义一个具有合适内存长度的引用变量(关于引用变量和值变量的差异可以参观VB.NET的书籍)
2、使用GCHandle.Alloc方法将变量的内存区域固定下来。
3、使用GCHandle对象的AddrOfPinnedObject取得该内存区域的首地址并赋值给指针变量.
4、对指针进行操作
5、使用GCHandle对象的free方法释放指针指向的内存区域以便NET垃圾回收器可以回收这个内存空间
6、VB.NET指针所指向数据的存取

在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指针所表示的地址中写入XXX类型的数据,而ReadXXX中作用就是将VB.NET指针所在地址的数据以XXX类型方式读出。

【编辑推荐】

  1. 简单描述VB.NET ProcessStartInfo对象
  2. VB.NET System.IO老鸟经验谈
  3. 分析VB.NET创建类的具体操作过程
  4. 快速了解VB.NET垃圾收集器
  5. 对VB.NET OBEX协议的简单概括

分享标题:一见钟情VB.NET指针
文章链接:http://www.shufengxianlan.com/qtweb/news19/495419.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联