一见钟情VB.NET指针

开发 后端
这里介绍VB.NET指针,在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等。

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

  1. '使用<StructLayout(LayoutKind.Sequential)>属性告诉net编译器:结构的元素在内存中按其出现的顺序排列  
  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字节数组指针  
  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协议的简单概括
责任编辑:佚名 来源: IT168
相关推荐

2009-10-28 13:35:25

VB.NET On E

2020-04-24 08:48:22

面试求职面试官

2012-12-27 16:23:25

简历应届毕业生

2013-07-25 13:33:58

2015-05-07 14:26:50

APM透视宝云智慧

2015-12-11 11:31:41

apm企业

2009-06-18 08:17:14

百度李彦宏马东敏

2009-11-10 16:46:52

VB.NET指针应用

2009-10-14 15:20:21

VB.NET窗体指针

2009-10-27 09:01:54

VB.NET内存指针

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-14 12:51:41

VB.NET Data

2009-10-20 14:21:55

VB.NET fnSi

2010-01-07 16:40:13

VB.NET一维数组

2009-11-02 17:12:01

VB和VB.NET

2009-10-23 13:14:38

点赞
收藏

51CTO技术栈公众号