在做机房的时候,遇到最多的问题就是“未将对象引用添加到对象实例”。每次遇到这样的问题,我一直在想:我在类中明明实例化类了,为什么还会出现这样的问题?还有“对象引用”什么意思?带着这些问题从网上查了一些关于对象引用和对象的知识,现做一下总结:
现在有一个类ClassA,对它进行实例化的过程如下:
'方法一有一段时间,我认为这是实例化类的方法之一,其实不然。这只是对实例化对象的引用,而不是对类的实例化。单看这行代码“Dim a = New ClassA()”其中包含4条信息:
Dim a = New ClassaA()
'方法二
Dim a as ClassA
a= New ClassA()
1)右边的“New ClassA”,是以ClassA类为模板,在堆空间里创建一个ClassA类对象(也简称为ClassA对象)。
2)末尾的()意味着,在对象创建后,立即调用ClassA类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写,.Net会给你补上一个默认的构造函数。
3)左边的“ClassA a”创建了一个ClassA类引用变量。所谓ClassA类引用,就是以后可以用来指向ClassA对象的对象引用。
4)“=”操作符使对象引用指向刚创建的那个ClassA对象。
实例化类ClassA的正确表达式
Dim a as New ClassA()
对象引用和对象实例的区别:
Dim a As ClassA,定义一个可以引用ClassA类型对象的变量a。这个a变量存在于栈上。
a=New ClassA()。New ClassA()创建ClassA实例对象,这个对象存在于托管堆上。然后(同时)让a引用(指向)这个对象。
a变量在栈上,而对象在托管堆上。
a储存的是对象的地址,而不是对象本身。
总结
不将就是发现问题的原动力,通过这个小问题,也找到了很多关于.Net内部运行机制的一些知识。下篇文章会将这些知识做一个总结....