一见钟情VB.NET指针

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

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

'使用<StructLayout(LayoutKind.Sequential)>属性告诉net编译器:结构的元素在内存中按其出现的顺序排列  
<StructLayout(LayoutKind.Sequential)> _  
Public Structure DEFUDT_Test  
Public bytb As Byte  
Public i32a As Int32  
End Structure  
 
Public Function fnGetIntptr1() As IntPtr  
'取得一个4字节数组指针  
Dim tabytTest(3) As Byte  
'以下语句告诉net垃圾回收进程不对tabytTest进行处理,也就是说tabytTest占用的内存区域固定不变。  
Dim thObject As GCHandleGCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)  
Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() '取得指向字节数组的指针  
 
'取得一个指向32位内存数据的指针,  
'由于使用gchandle取指针的方法只能对引用的对象有效,  
'所以对如int32等值类型必须使用将其封装成为一个对象的方法以变为引用类型  
Dim ti32Test As Object = Convert.ToInt32(0)  
'以下语句告诉net垃圾回收进程不对ti32test进行处理,也就是说ti32Test的内存位置固定不变。  
Dim thObject1 As GCHandleGCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)  
Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() '取得ti32Test的首地址  
 
Dim tudtTest1 As DEFUDT_Test  
'由于结构是一种值类型变量,为保证指针申请方便,我们申请  
'取得一个和结构tudtTest1大小一致的字节数组指针,只要空间占用长度和结构一样就可以了  
'由于net在结构封装中会插入额外的数据位,所以一定要用sizeof方法得到结构在非托管使用时的实际大小  
Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte  
Dim thObject2 As GCHandleGCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)  
Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() '取得指向结构的指针  
 
'在这儿你可以写对指针处理的任意代码(在例2中会给予补充)……  
 
'在使用完毕后一定要释放指针指向的内存块,让垃圾回收器可对这个内存块回收处理  
If thObject.IsAllocated Then  
thObject.Free()  
End If  
If thObject1.IsAllocated Then  
thObject1.Free()  
End If  
If thObject2.IsAllocated Then  
thObject2.Free()  
End If  
End Function 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.

上例中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

面试求职面试官

2013-07-25 13:33:58

2012-12-27 16:23:25

简历应届毕业生

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-20 14:21:55

VB.NET fnSi

2009-10-14 12:51:41

VB.NET Data

2010-01-07 16:40:13

VB.NET一维数组

2009-11-02 17:12:01

VB和VB.NET

2010-01-13 10:53:24

VB.NET控件
点赞
收藏

51CTO技术栈公众号