| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1074 人关注过本帖
标题:不能理解Set语句中有无New的区别?
只看楼主 加入收藏
VBhere
Rank: 2
等 级:论坛游民
帖 子:21
专家分:19
注 册:2010-3-9
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:7 
不能理解Set语句中有无New的区别?
以下是引用自VB MSDN的原文:

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 关键字,那么实际就会新建一个该对象的实例

问题:
(1)上边是MSDN的原文写的,但是我不能理解什么叫“就会新建一个该对象的实例”???

(2)上边的代码和我这样写的代码区别是什么?希望能举个合适的例子。
Dim myChildForms(1 To 4) As New Form1
Set myChildForms(1) = Form1
Set myChildForms(2) = Form1
Set myChildForms(3) = Form1
Set myChildForms(4) = Form1
搜索更多相关主题的帖子: New 语句 Set 
2010-03-24 15:53
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:4 

Dim myChildForms(1 To 4) As New Form1  -> 这一行相当于前面的的代码
程序代码:
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 myChildForms(1) = Form1
Set myChildForms(2) = Form1
Set myChildForms(3) = Form1
Set myChildForms(4) = Form1

授人于鱼,不如授人于渔
早已停用QQ了
2010-03-24 16:33
VBhere
Rank: 2
等 级:论坛游民
帖 子:21
专家分:19
注 册:2010-3-9
收藏
得分:0 
我理解是这样的,不知都对不对啊。

Dim myChildForms(1 To 4) As New Form1  这一行就是声明了类型是Form1,并且分别设置了4个窗体,即myChildForms(1 To 4)。
所以这一行代码就等于了
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 myChildForms(1) = Form1
Set myChildForms(2) = Form1
Set myChildForms(3) = Form1
Set myChildForms(4) = Form1
是把myChildForms(1 To 4)这4个变量都定义成了窗体Form1,等于是一个窗体4个名字。

不知道这样理解对吗?

另外再问一下Set语句有无New的区别?还是不理解?
“有New就会新建一个该对象的实例”,这个新建是指什么?设置?赋值?引用?声明?还是显示出来?
2010-03-24 17:18
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:3 
理解正确。
set 是赋值。
new 是新建,给那个类新的内存空间。
 
程序代码:
'class c1
Option Explicit

Public lTest As Long
Public iTest As Integer

Public Sub debugAddr()
    Debug.Print , "Long"; lTest, VarPtr(lTest), "Integer"; iTest, VarPtr(iTest)
End Sub

Private Sub Class_Initialize()
    Debug.Print "Initialize c1", , VarPtr(lTest), , VarPtr(iTest), VarPtr(lTest) - VarPtr(iTest)
End Sub

Private Sub Class_Terminate()
    Debug.Print "Terminate  c1", , VarPtr(lTest), , VarPtr(iTest)
End Sub
程序代码:
 ' form form1
Option Explicit

Private Sub Form_Load()
    Dim i&
    For i = 0 To 111
        Debug.Print
    Next
   
    Dim o1 As c1
    Set o1 = New c1
    o1.lTest = 1: o1.iTest = 2
    o1.debugAddr

    Set o1 = New c1
    o1.debugAddr
End Sub
2010-03-24 18:21
VBhere
Rank: 2
等 级:论坛游民
帖 子:21
专家分:19
注 册:2010-3-9
收藏
得分:0 
回复 4楼 bczgvip
既然上边的5行代码可以用1行代码就能写成,那为什么还要有这样1行代码和5行代码的两种写法呢?
2010-03-24 19:58
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:3 
有些时间需要使用到 这种分开来写的情况。

如 新建窗口

dim fr as form1
set fr = new form1
   fr.show

这三行代码里,
第一行可能是在别的地方定义的,而后面二行代码是在一个按钮的事件里。
要求按下这按钮后,生成一个新的窗体,然后还在这个新的窗体里进行一些动作时。
最后,这个窗体是MDI 子窗口,使用 for each  In forms 来访问的。
这种情况下,使用
  dim fr as new form1 有些不方便 。



授人于鱼,不如授人于渔
早已停用QQ了
2010-03-24 20:04
VBhere
Rank: 2
等 级:论坛游民
帖 子:21
专家分:19
注 册:2010-3-9
收藏
得分:0 
明白了 谢谢
4楼的代码一点也没看懂,因为我还没仔细研究过类模块呢
2010-03-25 09:12
三断笛
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:31
帖 子:1621
专家分:1617
注 册:2007-5-24
收藏
得分:0 
set a=objectA与set a=new objectB的区别?
第一个set a=objectA中,objectA必须是一个确定的实例,而不能是类名称
第二个set a=new ClassA中,ClassA是一个类名称,这里先实例化一个ClassA,再赋值给a.
第一种的用法是最常用的,不用多说.
第二种写法当然可以退化成第一种写法,但它有一些用法对初学者来说可能会有一些诡异.
比如说有这样的代码:
dim k as ClassA
set k=new ClassB
这里声名的K是ClassA类型,实例化却是ClassB的类型,当然,这里的ClassB必须是继承ClassA的.这种用法主要用于多态.十分强大.
这样的用法也可以用在参数中.比如有这样一个函数声名:
public SUB FunA(Parama as ClassA)
你可以这样调用它:
CALL funA (New ClassA)
甚至
CALL FunA(New ClassB)
当然,这里的ClassB也必须继承ClassA.
如果函数声名成这样:public SUB FunA(Parama as Object)
那就更自由了.

2010-03-25 14:49
快速回复:不能理解Set语句中有无New的区别?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013435 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved