vb.netof用法 vbnet using
用最简单的代码介绍一下指针在VB.net里面的用法?
例1:以下程序我们申请几个指向不同类型的指针:
10年积累的成都网站设计、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有西夏免费网站建设让你可以放心的选择与我们合作。
’使用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 GCHandle = 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 GCHandle = 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 GCHandle = 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、 定义一个具有合适内存长度的引用变量(关于引用变量和值变量的差异可以参观VB.NET的书籍)
2、使用GCHandle.Alloc方法将变量的内存区域固定下来。
3、使用GCHandle对象的AddrOfPinnedObject取得该内存区域的首地址并赋值给指针变量.
4、对指针进行操作
5、使用GCHandle对象的free方法释放指针指向的内存区域以便net垃圾回收器可以回收这个内存空间
2、指针所指向数据的存取
在.net中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指针所表示的地址中写入XXX类型的数据,而ReadXXX中作用就是将指针所在地址的数据以XXX类型方式读出。看例程2,我们使用这些方法演示对例1那几个指向不同类型数据的指针作数据存/取操作。
例2:演示向例1申请得到的几个指针执行写入及读取数据的操作.
Marshal.WriteInt32(tpObject1, 0, Convert.ToInt32(77)) ’向ti32Test变量指向的地址写入32位整数77
MsgBox("现在ti32Test的值为:" ti32Test) ’因为变量存储地址的数据已改为77,所以显示为77
’以下这句之所以可行,因为ti32Test是32位整数,而tpObject指向的tabytTest数组刚好有4个元素
’而每一个byte元素都占用8位,合起来就是32位,和ti32Test占用的空间一样。这就印证了前面提’
’到的net中指针没有指向类型的说明。
Marshal.WriteInt32(tpObject, 0, ti32Test)
’以下代码再将tabytTest字节数组的内容理解为一个int32整数,
’并将值赋值给tudtTest结构中的int32元素
’我们使用Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32以取得i32a元素在结构中的内存偏移位置
’所以New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32)就临时产生了
’一个指针并指向i32a所在的内存地址(, 这个方法也说明了指针可以以字节为单位进行加减计算以指向合适的变量。
’Marshal.ReadInt32的作用是从指针中读取一个32整数。
Marshal.WriteInt32(New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32), _
0, Marshal.ReadInt32(tpObject))
’这儿可以将字节数组的内容复制到真正的结构中
MsgBox(Marshal.OffsetOf(tudtTest1.GetType, "i32a").ToInt32)
tudtTest1 = CType(Marshal.PtrToStructure(tpObject2, GetType(DEFUDT_Test)), DEFUDT_Test)
MsgBox("结构tidtTest1中i32a元素的值为:" tudtTest1.i32a) ’此处将显示刚赋的值77
关于VB.NET 的AddressOf 问题
你好,EnableDisconnectNotification、 EnableWriteNotification 这两个是外部函数吧,是委托吗?
建议使用委托可以看看下面的例子
此示例演示如何使用委托将过程传递给另一个过程。
委托是一种类型,与任何其他类型一样可在 Visual Basic 中使用。AddressOf 运算符如果应用到一个过程名,则返回一个委托对象。
此示例有一个具有委托参数的过程,该委托参数可接受对另一个过程的引用,而引用则是通过 AddressOf 运算符获得的。
创建委托和匹配过程
创建一个名为 MathOperator 的委托。
Visual Basic
复制代码
Delegate Function MathOperator( _
ByVal x As Double, _
ByVal y As Double _
) As Double
创建一个名为 AddNumbers 的过程,其参数和返回值与 MathOperator 的参数和返回值匹配,以使签名匹配。
Visual Basic
复制代码
Function AddNumbers( _
ByVal x As Double, _
ByVal y As Double _
) As Double
Return x + y
End Function
创建名为 SubtractNumbers 的过程,其签名与 MathOperator 匹配。
Visual Basic
复制代码
Function SubtractNumbers( _
ByVal x As Double, _
ByVal y As Double _
) As Double
Return x - y
End Function
创建一个名为 DelegateTest 的过程,它接受一个委托作为参数。
此过程可接受对 AddNumbers 或 SubtactNumbers 的引用,这是因为它们的签名与 MathOperator 签名匹配。
Visual Basic
复制代码
Sub DelegateTest( _
ByVal x As Double, _
ByVal op As MathOperator, _
ByVal y As Double _
)
Dim ret As Double
ret = op.Invoke(x, y) ' Call the method.
MsgBox(ret)
End Sub
创建一个名为 Test 的过程,它使用 AddNumbers 的委托作为参数调用 DelegateTest 一次,然后使用 SubtractNumbers 的委托作为参数再次调用。
Visual Basic
复制代码
Protected Sub Test()
DelegateTest(5, AddressOf AddNumbers, 3)
DelegateTest(9, AddressOf SubtractNumbers, 3)
End Sub
调用 Test 时,它首先显示 AddNumbers 对 5 和 3 的操作结果,也就是 8。然后显示 SubtractNumbers 对 9 和 3 的操作结果,也就是 6。
创建一个名为 MySubDelegate 的委托。
Delegate Sub MySubDelegate(ByVal x As Integer)
声明一个类,该类包含与该委托具有相同签名的方法。
Class class1 Sub Sub1(ByVal x As Integer) MsgBox("The value of x is: " CStr(x)) End Sub End Class
定义一个方法,该方法创建该委托的实例并通过调用内置的 Invoke 方法调用与该委托关联的方法。
Protected Sub DelegateTest() Dim c1 As New class1 ' Create an instance of the delegate. Dim msd As MySubDelegate = AddressOf c1.Sub1 ' Call the method. msd.Invoke(10) End Sub
VB.net 如何使用
1. 什么是类和对象?
答:类包含某一类对象的数据和过程。对象是类的实例。
2. 为什么采用类和对象进行程序设计?
答:以便按照对象定义类,提高程序代码的可重用性,避免重复劳动。
3. 在同一个类中,应当包括哪些对象的属性和方法?
答:同一类对象的数据和过程。
4. VB程序设计主要包括哪两个方面的内容?
答:Windows应用程序界面和代码。
5. 什么是事件驱动?
答:根据事件转去执行相应的事件处理过程。
1. 控件是窗体上的 对象 。
2. Visual Basic具有 BASIC程序语言简单易学的 优点,新增了 可视化和面向面向对象程序设计的 热点,是 Windows编程人员广泛使用的编程 工具。
3. 对象的 属性 是在其类中定义的数据。
4. 对象的 方法 是在其类中定义的过程。
5. 对象本身的动作或功能称为 方法 ,外界施加于某对象的动作或操作称为 事件 。
1.面向过程
是指从功能的角度分析问题,将待解决的问题空间分解成若干个功能模块,每个功能模块描述一个操作的具体过程。
2.面向过程程序设计
主要是根据事务本身的逻辑过程进行编程的一种方法。
3.面向对象程序设计
是一种计算机编程架构,是由单个能够起到子程序作用的单元或对象组合而成。即按照对象编写程序。
4.事件驱动程序设计
是一种电脑程式设计模型。这种模型的程式执行流程是由使用者的动作或者是由其他程式的讯息来决定的。
5.函数
是一种特定的运算,在程序中使用一个函数时,只要给出函数名并给出一个或多个参数,就能得到它的函数值
6.过程
是程序中可以执行的一段代码,过程包含在一个声明语句和一个结束语句之间
7.类
是所有具有共同特征的事物的抽象,是一个抽象的概念(类是一组具有相同属性特征的对象的抽象描述,是面向对象程序设计的又一个核心概念或者类是对一组对象共同具有的属性和行为的抽象,具有封装和隐藏性、还具有继承性)。
8.对象
是一个属性集合及其操作的封装体(对象是用来描述现实世界中客体的部件,是面向对象软件系统在运行时刻的基本单位)。
类是对象的抽象,对象是类的实例。
9.事件
窗体或控件识别的动作
10.事件驱动
根据事件转去执行相应的事件处理过程。
11.属性
是一个对象的特性,不同的对象有不同的属性
12.算法
指解决某个问题的严格方法,描述有始有终的计算过程。
5.属性窗口中属性值被设置的方式有哪几种?
6种:输入 选取 浏览 赋值 默认 拖动
1.程序代码是由一行一行的 语句 所组成。
3.在程序代码中可将一个语句分成两段的特殊符号为( _ )。
5.数值变量如果没有设置初值,则内定值为 0 。
7.如果有一个变量,可能会存放数值数据或字符串数据,此时可以声明该变量为 对象变量。
9. Integer数据类型占 4 bytes的内存空间,可以表示的数值范围为 -2,147,483,648~2,147,483,647 的整数
3.VB.NET程序语言数据类型的种类有哪些?
(1)数值型
①整形数:短整形(Short)、整形(Integer)、长整型(Long)
②字节型(Byte)
③实型数:单精度型(Single)、双精度型(Double)
④货币型(Decimal)
(2)字符型(Char)和字符串型(String)
(3)逻辑型/布尔型(Boolean)
(4)日期型(Date)
(5)对象型(Object)[即可变型(Variant)]
1.局部变量、全局变量、跨模块变量分别在何处声明?其生存期分别是多少?
局部变量在程序内声明。生存期为从所在的程序运行开始到程序结束。
全局变量在窗体内所有程序的外边声明。生存期为由该变量声明开始,一直到程序退出运行为止。
跨模块变量在一般模块的声明区用Public来声明。生存期为从一个Windows应用程序项目文件开始运行到结束。
3.什么是静态变量?
静态变量是在离开程序时能够继续保留目前的值,待下回进入该程序时能够继续保留的变量值的局部变量,用Static关键字声明。
(一)问答题
1.请简单说明在程序中使用程序的好处。
(1)程序可以重复使用,以方便维护与程序调试。
(2)程序可以让其他工程或项目使用。
(3)程序的逻辑简单、明确,可以让程序变得简单且可读性高。
(4)程序具有模块化的功能,因此可以将一个大的应用程序分成数个小的且不同功能的程序,让不同的程序设计师分别编写独立不同功能的程序,并以团队开发,加快应用程序开发的时间。
3.试比较传值调用与传址调用的差异。
(1)声明方式不同:
传值——在程序中的虚自变量之前加上ByVal
传址——在程序中的虚自变量之前加上ByRef
(2)占用内存不同
传值——调用程序的实自变量与被调用程序的虚自变量占用不同内存
传址——调用程序的实自变量与被调用程序的虚自变量占用同一地址的内存,也就是说,在做参数传递时,调用程序中的实自变量是将自己本身的内存地址传给被调用程序的虚自变量
(3)虚自变量更改结果不同
传值——使用传值调用可以防止变量被程序修改
传址——被调用程序可以通过虚自变量将值传回给调用程序
5.什么是程序多载?
程序多载是使用不同的自变量串行或数据类型来加以区分相同名称的程序。
VB.NET 中的Of是什么意思
泛型参数,表示一种特定类型,通常用于集合List, Dictionary之类的。
原型:Dictionary(Of TKey, TValue)
原型不能直接使用,必须给TKey, TValue指定一个类型(Type)
强类型字典:Dictionary(Of String, String)
表示键和值都为String类型的字典。
vb.net 线程 如何动态 address of 过程,即 "过程" 是可以用户动态传送的。
过程名是不可能作为参数使用的,想必你需要调用的过程是有限的,那么可以用一个变量来确定:
sub 过程名(p as integer)
Dim i As Threading.Thread
select case p
case 1
i = New Threading.Thread(AddressOf 过程1)
case 2
i = New Threading.Thread(AddressOf 过程2)
.........................
..........................
end select
i.start()
end sub
VB.NET 泛函数 system.collections.generic.list(of textbox) 的使用问题!
Public Function GetTextboxFromFrm(ByVal frm As Control) As List(Of TextBox)
Dim obj As Control
Dim listTB As New List(Of TextBox)
For Each obj In frm.Controls
If TypeOf obj Is TextBox Then
Debug.WriteLine(obj.Name " " obj.Text)
listTB.Add(obj)
Else
If obj.HasChildren Then
listTB.AddRange(GetTextboxFromFrm(obj))
End If
End If
Next
Return listTB
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '我放到按钮事件里了,你自己改成函数
Dim AllTextBox As List(Of TextBox)
Dim cc() As String '这个数组保存所有文本框的Text
Dim i As Integer = 0
AllTextBox = GetTextboxFromFrm(Me)
For Each tb As TextBox In AllTextBox
ReDim Preserve cc(i)
cc(i) = tb.Text
i += 1
Next
End Sub
网站栏目:vb.netof用法 vbnet using
当前网址:http://myzitong.com/article/hgjpdg.html