as new object和 as object的区别

懒人想做的事 2011-09-18 02:57:03
代码1:
dim A as CaoZuoClass'(声明包括:系统对象,自定义类)
Function go() as string
set a=new CaoZuoClass'通过SET初始化对象
a.xxx="111"
....
end Function

代码2:
dim A as new CaoZuoClass'(声明包括:系统对象,自定义类)
'使用NEW在声明的时候并初始化
Function go() as string
A.xxx="111"
....
end Function



请问在项目开发中,分有什么影响和区别?
我听说用NEW在程序长时间运行的时候不能释放内存等弊端,求高人指点:)
声明的对象最好多久释放一次?
...全文
231 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
懒人想做的事 2011-09-18
  • 打赏
  • 举报
回复
根据上面两位高人指点,我这样理解了:

dim A as CaoZuoClass

set a=new CaoZuoClass

等价于

dim A as new CaoZuoClass

还有,内存不会泄漏。
王二.麻子 2011-09-18
  • 打赏
  • 举报
回复
vb会为每个对象维护一个对象计数器,大概就是msvbvm60.dll里面的addref

对于对象的引用:
dim a as object

dim b as object

set a=new ...

set b=a
对象b是a的引用,a所指向对象实例的计数器理解为2,这个对象实例不会从内存种删除...
在过程结束,过程种创建的对象,引用都要卸载,就是依次减少对象的计数器...如果计数器为0,就删除对象...

实际vb的内存泄漏没那么厉害,正常的操作应该是没有泄漏,不会占内存越来越大的.毕竟对象的内存维护是vb系统来做的...C要程序员维护的...
王二.麻子 2011-09-18
  • 打赏
  • 举报
回复
dim A as CaoZuoClass'只是定义A的类型,这个时候A还没有指定对象实例

set a=new CaoZuoClass'产生一个类型是CaoZuoClass的实力,放在变量a

dim A as new CaoZuoClass'定义一个类型是CaoZuoClass的变量a,并且把a变量实例.
-----------
dim A as CaoZuoClass'这个时候只是确定了a的类型,在内存种,变量a的内存内容实际是0,就是没有具体的实例,set a=new CaoZuoClass'变量a的内存的内容是一个指针,指向一个CaoZuoClass实例.
dim A as new CaoZuoClass'可理解为前面2个步骤1次执行.

贝隆 2011-09-18
  • 打赏
  • 举报
回复

Set 语句



将对象引用赋给变量或属性。

语法

Set objectvar = {[New] objectexpression | Nothing}

Set 语句的语法包含下面部分:

部分 描述
objectvar 必需的。变量或属性的名称,遵循标准变量命名约定。
New 可选的。通常在声明时使用 New,以便可以隐式创建对象。如果 New 与 Set 一起使用,则将创建该类的一个新实例。如果 objectvar 包含了一个对象引用,则在赋新值时释放该引用。不能使用 New 关键字来创建任何内部数据类型的新实例,也不能创建从属对象。
objectexpression 必需的。由对象名,所声明的相同对象类型的其它变量,或者返回相同对象类型的函数或方法所组成的表达式。
Nothing 可选的。断绝 objectvar 与任何指定对象的关联。若没有其它变量指向 objectvar 原来所引用的对象,将其赋为 Nothing 会释放该对象所关联的所有系统及内存资源。


说明

为确保合法,objectvar 必须是与所赋对象相一致的对象类型。

Dim、Private、Public、ReDim以及 Static 语句都只声明了引用对象的变量。在用 Set 语句将变量赋为特定对象之前,该变量并没有引用任何实际的对象。

下面的示例说明了如何使用 Dim 来声明 Form1 类型的数组。Form1 实际上还没有实例。然后使用 Set 将新创建的 Form1 的实例的引用赋给 myChildForms 变量。在 MDI 应用程序中可以使用这些代码来创建子窗体。

Dim myChildForms(1 to 4) As Form1
Set myChildForms(1) = New Form1
Set myChildForms(2) = New Form1
Set myChildForms(3) = New Form1
Set myChildForms(4) = New Form1

通常,当使用 Set 将一个对象引用赋给变量时,并不是为该变量创建该对象的一份副本,而是创建该对象的一个引用。可以有多个对象变量引用同一个对象。因为这些变量只是该对象的引用,而不是对象的副本,因此对该对象的任何改动都会反应到所有引用该对象的变量。不过,如果在 Set 语句中使用 New 关键字,那么实际上就会新建一个该对象的实例。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧