95分,请问DIM a AS 类1 和 dim a as new 类1 的区别
请问DIM a AS 类1 和 dim a as new 类1 的区别
还有这两种形式定义的变量如何释放。
[最优解释]
DIM a AS 类1
这只是定义一个类的变量,这种时候,这个变量其实相当与一个指针,而指针地址中的类并没有实例化,也可以理解为没有载入堆栈,只是一个空的地址指针。不过这个地址指针可以随意的设置成别的地址。
比如:
Dim a As 类1
Dim UU As New 类1
Set a = UU
而
dim a as new 类1
这种方法其实可以拆开来看如:
Dim a As 类1
Set a = new 类1
Dim a As 类1 的意思我们知道了,是定义一个变脸,并且变量内容是指向一个类的指针,但因为这个类型没有实际的分配出内存并载入堆栈,所以这个时候这个变量是无用的,只是个指向空地址无用变量。
而 new 类1 就是将这个类创建一个新实例的过程,并将这个创建好的新实例地址赋值给 a 这个变量。也可以理解为在内存中划分了一块符合这个类所需要的内存区域,并将相关过程载入到该内存中,并将这个内存地址载入堆栈共CPU执行。而这块分配好的地址句柄便是这个类的实例句柄。也就是 a 这个类指针真正存储的东西。
当调用变量的属性、方法或事件时,其实就是CPU根据代码寄存器再内部跳转执行编译位置代码,每一个实例有一个独立的内存块,即使结构一直,但内容不同,这就是类和类实例化的关系。
在VB中理解,就是
Dim a As 类1 '是定义类变量
Set a = new 类1 '是初始化类变量(加上“实例”更为贴切)
Dim a As New 类1 '是定义类变量同时初始化类变量
因为类必须初始化,如果没有初始化的类是不能用的。
即使有些类或对象不是经由你的代码初始化,也是系统或别的程序帮你初始化了才能用,如 me、app、Form1...
至于类的释放,就是上面所说的
set a= nothing
在VB中,当这样设置类时,类中会产生 Terminate 事件,类里会释放一些有关资源,直至最后还会将为 a 变量分配的内存也释放掉。
[其他解释]
1, DIM a AS 类1 ,还有用set a = new 类1,来建立
dim a as new 类1,可以直接使用,
2, set a = nothing
[其他解释]
前者是声明
后者不仅声明了,还实例化了该对象。
VB中释放对象都是使用Set XX=Nothing
[其他解释]
+1
[其他解释]
+1
[其他解释]
+1
[其他解释]
DIM a AS 类1 '声明a是这个类1对象,但是类1必须通过 set a=new 类1创建,否则为nothing
dim a as new 类1 ' 声明一个类1对象,但不需要显示创建对象,会自动创建
当后续代码第一次调用 a.方法或a.属性时,系统会自动创建
[其他解释]
对象变量或 With 块变量没有设置(错误 91)
创建对象变量有两个步骤。第一,必须先声明对象变量。然后必须用 Set 语句将一个正确的引用赋值给对象变量。同样地,With...End With 块必须先用 With 语句进入点来执行初始化。此错误有以下的原因和解决方法:
试图使用的对象变量,还没有用一个正确对象的引用来赋值。
给对象变量指定或再指定一个引用。例如,如果在下列的代码中省略 Set 语句的话,那么引用 MyObject 将会产生错误:
Dim MyObject As Object ' 创建对象变量。
Set MyObject = Sheets(1) ' 创建一个正确的对象引用。
MyCount = MyObject.Count ' 计数值赋给 MyCount。
试图用的对象变量已经被设为 Nothing。
Set MyObject = Nothing ' 释放此对象。
MyCount = MyObject.Count ' 引用了已释放的对象。
再指定引用给对象变量。例如,使用新的 Set 语句给对象设置新的引用。
此对象是正确的对象,但没有被设置,因为在对象库中,在 “引用” 对话框中没有被选取。
在 “添加引用” 对话框选择对象库。