请教一个vb中对象声明的问题

gooore 2009-05-04 09:35:57
Dim A as new classA

Dim A as classA
Set A = new classA

Dim A as Object
Set A = new classA

这三种对象的声明方式,系统在为对象分配资源的时候有什么区别?
...全文
269 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
gooore 2009-05-04
  • 打赏
  • 举报
回复
同意,可是这样检查不行吗?

VB codeOn Error Resume Next
Dim A As classA
Set A = new classA
If Err <> 0 Then
MsgBox "组件没被正确注册。"
End If


[Quote=引用 11 楼 chenjl1031 的回复:]
后期绑定要这样用才不会出错:

VB codeOn Error Resume Next
Dim A As Object
Set A = CreateObject("classA")
If Err <> 0 Then
MsgBox "组件没被正确注册。"
End If
[/Quote]

谢谢回复。 还是回来原来这个问题,
我感觉这三种声明方式在空间的分配和释放顺序是不一样的,可是不是太明白。

不胜感激
东方之珠 2009-05-04
  • 打赏
  • 举报
回复
后期绑定要这样用才不会出错:
On Error Resume Next
Dim A As Object
Set A = CreateObject("classA")
If Err <> 0 Then
MsgBox "组件没被正确注册。"
End If
gooore 2009-05-04
  • 打赏
  • 举报
回复
谢谢回复。
不是很明白你的例子,什么时候还不是可以用set classA = nothing吗? :)
我就是感觉这三种声明方式在空间的分配和释放顺序是不一样的,可是不是太明白。

不胜感激

[Quote=引用 6 楼 slowgrace 的回复:]
这么说来,它们在资源的占用上还是有区别的。

我也打个比方:一个人向你借1万元,因为5月4号的时候他要用这钱。

一种借法是元旦就借,年底才还。这个相当于:Dim A as new classA
一种借法是5月4号早上借,4号晚上就还。这个相当于:Set A = new classA
一种借法是5月4号找你借钱,你给相熟的朋友打个电话,让这人去找那人借,那人用完钱晚上把钱还了那人,并回来向你致谢。这个相当于:第三种。

向别人借钱的人…
[/Quote]
gooore 2009-05-04
  • 打赏
  • 举报
回复
谢谢回复,据我的了解,后期绑定的一大优势是创建实例的时候采用createobject(classA),从而不用考虑dll等编译之后的兼容性问题,想问下四楼,如果dll未被正确注册,那么必须用这个方法来检测吗?采用前面两种方法声明也会有错误的把?

不胜感激

[Quote=引用 3 楼 Tiger_Zhao 的回复:]
如果你要问分配的资源,很不幸,它们是一样多的:
无论声明是什么对象变量,指针总是 4 字节,创建的是相同类的对象,所以对象自身的内存也一样多。

所以要说很不幸,因为它们的行为表现实在大不同,要说明白需要长篇大论,只要记住:
·声明1
 A 始终自动创建。如果你把它想象成一个无法切断电源的电器,就明白为什么不推荐使用了。
·声明2
 标准做法,对的就是对的,没什么好说的。
·声明3
 A属于“后期绑…
[/Quote]
东方之珠 2009-05-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Sandrer 的回复:]
引用 3 楼 Tiger_Zhao 的回复:
如果你要问分配的资源,很不幸,它们是一样多的:
无论声明是什么对象变量,指针总是 4 字节,创建的是相同类的对象,所以对象自身的内存也一样多。

所以要说很不幸,因为它们的行为表现实在大不同,要说明白需要长篇大论,只要记住:
·声明1
 A 始终自动创建。如果你把它想象成一个无法切断电源的电器,就明白为什么不推荐使用了。
·声明2
 标准做法,对的就是对的,没什么好说的…
[/Quote]


老鸟说得很精辟!之所以推荐第二种,是因为要先定义(不分配内存),然后,需要的时候再实例化(分配内存),不需要时用Set语句释放内存,起到节约用电的作用。后期绑定是有的,只是用得少。
slowgrace 2009-05-04
  • 打赏
  • 举报
回复
感觉你在4楼的做法没什么不妥。继续关注。
slowgrace 2009-05-04
  • 打赏
  • 举报
回复
这么说来,它们在资源的占用上还是有区别的。

我也打个比方:一个人向你借1万元,因为5月4号的时候他要用这钱。

一种借法是元旦就借,年底才还。这个相当于:Dim A as new classA
一种借法是5月4号早上借,4号晚上就还。这个相当于:Set A = new classA
一种借法是5月4号找你借钱,你给相熟的朋友打个电话,让这人去找那人借,那人用完钱晚上把钱还了那人,并回来向你致谢。这个相当于:第三种。

向别人借钱的人相当于声明对象的程序员。

你相当于资源。

你感受一下这三者的区别?
Sandrer 2009-05-04
  • 打赏
  • 举报
回复
如果不检测的话,你的某个类没被注册,那么程序运行的时候直接会提示出错然后自动关闭,而不能自己作出相应的处理!

除非你把类写到你的程序里头!
Sandrer 2009-05-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Tiger_Zhao 的回复:]
如果你要问分配的资源,很不幸,它们是一样多的:
无论声明是什么对象变量,指针总是 4 字节,创建的是相同类的对象,所以对象自身的内存也一样多。

所以要说很不幸,因为它们的行为表现实在大不同,要说明白需要长篇大论,只要记住:
·声明1
 A 始终自动创建。如果你把它想象成一个无法切断电源的电器,就明白为什么不推荐使用了。
·声明2
 标准做法,对的就是对的,没什么好说的。
·声明3
 A属于“后期绑…
[/Quote]

在我的程序中,我经常使用一些我自己编写的dll或ocx
在某些情况下,你不确定客户端是否正确注册了这些文件
就需要使用 Dim A As Object 来检测它们是否已被注册!


On Error Resume Next
Dim A As Object
Set A = New Class1
If Err <> 0 Then
MsgBox "组件没被正确注册。"
End If
Tiger_Zhao 2009-05-04
  • 打赏
  • 举报
回复
如果你要问分配的资源,很不幸,它们是一样多的:
无论声明是什么对象变量,指针总是 4 字节,创建的是相同类的对象,所以对象自身的内存也一样多。

所以要说很不幸,因为它们的行为表现实在大不同,要说明白需要长篇大论,只要记住:
·声明1
 A 始终自动创建。如果你把它想象成一个无法切断电源的电器,就明白为什么不推荐使用了。
·声明2
 标准做法,对的就是对的,没什么好说的。
·声明3
 A属于“后期绑定”。做个类比就是:你要给你爸妈打电话,还需要查114才能知道你爸妈的电话。
 99%的情况下这太蠢了,不推荐使用。
slowgrace 2009-05-04
  • 打赏
  • 举报
回复
关注
hehaiyi2008 2009-05-04
  • 打赏
  • 举报
回复
dim 是定义
set 是赋值
Tiger_Zhao 2009-05-04
  • 打赏
  • 举报
回复
我之所以说“99%的情况下这太蠢了,不推荐使用。”是因为的确会有使用“后期绑定”的需要,但绝对不是下面这种给爸妈打电话还要查114的用法。
[Quote=引用 4 楼 Sandrer 的回复:]
On Error Resume Next
Dim A As Object
Set A = New Class1
If Err <> 0 Then
MsgBox "组件没被正确注册。"
End If[/Quote]

7,763

社区成员

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

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