为什么要写这个博客呢?可能是因为自己的基础太差,昨天敲三层的注册,各层都敲完了以后,死活报错,无奈之下只能找晓婵求救,她只改了三个地方,犯了同一个错误,我的源码是这样写的:Dim uA As Entity.UserInfo,然后就会报这个错:
晓婵的改法是:Dim uA As New Entity.UserInfo,当时觉得好坑,自己整了半天就是因为少了一个NEW,其实之前用vb敲机房的时候也肯定有这个问题,但是自己从来没有注意过,这次特意去查了一下,为什么加new和不加new差别这么多,下面基本都是别人写的,拿来科普给自己。
1.new的作用
先来看看dim a as 类1 和dim a as new 类1的区别:
DIMaAs 类1'声明a是这个类1对象,但是类1必须通过seta=new类1创建,否则为nothing
Dima Asnew类1'声明一个类1对象,但不需要显示创建对象,会自动创建
当后续代码第一次调用a.方法或a.属性时,系统会自动创建
所以new就相当于这句:set a =new 类1,是一个初始化的过程。
2.如何创建对象(实例化)
DimaAs类1的意思我们知道了,是定义一个变量,并且变量内容是指向一个类的指针,但因为这个类型没有实际的分配出内存并载入堆栈,所以这个时候这个变量是无用的,只是个指向空地址无用变量。
而new类1就是将这个类创建一个新实例的过程,并将这个创建好的新实例地址赋值给a这个变量。也可以理解为在内存中划分了一块符合这个类所需要的内存区域,并将相关过程载入到该内存中,并将这个内存地址载入堆栈共cpu执行。而这块分配好的地址句柄便是这个类的实例句柄。也就是a这个类指针真正存储的东西。
当调用变量的属性、方法或事件时,其实就是cpu根据代码寄存器再内部跳转执行编译位置代码,每一个实例有一个独立的内存块,即使结构一直,但内容不同,这就是类和类实例化的关系。
在VB中理解,就是
DimaAs类1'是定义类变量
Seta=new类1'是初始化类变量(加上“实例”更为贴切)
DimaAsNew类1'是定义类变量同时初始化类变量
因为类必须初始化,如果没有初始化的类是不能用的。
即使有些类或对象不是经由你的代码初始化,也是系统或别的程序帮你初始化了才能用,如me、app、Form1...
3.为什么要实例化?
因为只有实例化之后,才能将这个对象放到内存中,然后才能在规定的范围内来调用。这不包括静态对象,静态对象是可以直接调用的。
每次实例化其实都是一个新建的过程
例如dim a as new Object();这句话,你可以写无数次,只要每次起到名字不同,就会在内存中创建无数个Object对象,这样在调用其中任意一个的时候互不干扰。
自己查找了这么多的东西以后,其实对于new这个问题也了解了,可能以后再来看new会发现自己现在了解的还只是一个皮毛,不过这个阶段,也是必须要经历的啊!
原文链接:https://www.f2er.com/vb/257564.html