![51c7d41ef93091fb6d5d865434849114.png](https://i-blog.csdnimg.cn/blog_migrate/87fc5f4e1c35a67515a212a9bade101e.png)
原文链接:
No.22 VB中变量的生命周期和作用域mp.weixin.qq.com![8e29f486f6fa89dae1f770d560836726.png](https://i-blog.csdnimg.cn/blog_migrate/b93b97ce6e28a3daa9f6d7ff8f227901.png)
这几天我们讲了通用对话框【字体】【打开】【另存为】的使用,按照惯例接下来应该讲【颜色】和【打印】对话框,但是后台有一位朋友想要了解VB中变量的生命周期和作用域,所以今天先插一节课,讲一下“Public”、“Private”、“Dim”和“Static”,明天我们再继续讲通用对话框。
Private和Public
VB有三种级别的变量,分别是局部变量,窗体/模块变量,全局变量。
就好比学校班级里的小组长就是局部变量,他只能管自己的小组成员,班长就是窗体/模块级别的变量,可以管整个班级的小组成员,而学生会就是全局变量,他可以管每一个学生。
Private从字面上看就是私有的,在它声明的过程中,变量就是局部的,例如在窗体的Load事件中定义一个变量 i 并赋值,然后我们通过弹出对话框来查看 i 的值:
![a08c106b17114ee9fdb9e4b7abfc3aed.png](https://i-blog.csdnimg.cn/blog_migrate/060880fef9ea373133a84909a01d7ba7.png)
看下运行效果:
![7f46905adb48e864288ec14165fdcabf.gif](https://i-blog.csdnimg.cn/blog_migrate/3f7595bc38e2cde58778c832a56c81db.gif)
很明显 变量i只在按钮1的单击过程有效,这就是所谓的局部变量。
接下来我们打开代码窗口,在最上方选择“通用”,在通用里定义一个变量a,然后我们再在这个窗体的不同过程中调用这个变量a:
![7bd17ce2970743bdef1674749dd226f0.png](https://i-blog.csdnimg.cn/blog_migrate/ec6a4db2eb2f4e991d5fafb59d6325a2.png)
然后我们在这几个按钮的单击事件中调用变量a:
![c286091c7c8d6a0eb31e02946022e1bd.png](https://i-blog.csdnimg.cn/blog_migrate/4d99327f5a561bae02f245ca74c9b39f.png)
运行效果:
![e69ff76fd1147a6cc3b661a04cab2b9d.png](https://i-blog.csdnimg.cn/blog_migrate/e81eaeefbcb24a38986f9b8baf772ea6.png)
在这个窗体范围内,这个变量都是有效的,但是在其他窗体中这个变量是无效的,这就是窗体/模块变量。
为了解释全局变量,我们添加一个窗体,让程序拥有多个窗体,再添加一个模块。
![56af70b5ea573e4ebf6a7f1592d513b9.png](https://i-blog.csdnimg.cn/blog_migrate/836504569f2096e7bfdd81d4e6a0c309.jpeg)
![8198b382deac4a50185893724be19e59.png](https://i-blog.csdnimg.cn/blog_migrate/73588698db1887cbd9013a050153e2b6.png)
![e94eccf7f8b4a25e24d3420b75765e62.png](https://i-blog.csdnimg.cn/blog_migrate/cb7e07a291ce5b0169f5ad52df56f71a.jpeg)
![a1d7db04dab640cc63297cd5d9e29fa5.png](https://i-blog.csdnimg.cn/blog_migrate/581e913f1c356b4b61f45f30623f142c.png)
我们打开刚才添加的模块,在模块中声明变量 k,然后在窗体1和窗体2的按钮单击事件中显示这个变量 k ,看一看这个变量是否有效:
![6211af7e01e751fe0c8b1e36661c27b9.png](https://i-blog.csdnimg.cn/blog_migrate/a1e8740aa7728339480f8c36ede201e2.png)
![bcec9f5c4ac6836f1e73259f44fa49bc.png](https://i-blog.csdnimg.cn/blog_migrate/63761d4e073744873f107853765acbd1.png)
![ba180598e642f4fc7fbe14275977fa38.png](https://i-blog.csdnimg.cn/blog_migrate/d3cae4a85112f0b567c0bfd0ddfdc565.png)
运行效果:
![78929e94aaf5fd3d6522e89d34c29e45.png](https://i-blog.csdnimg.cn/blog_migrate/8060bf8c7d5230572d4fca739f6cacaf.png)
我们可以清楚的看到,变量k可以在整个工程里任意一个窗体,任意一个过程中有效,这就叫做全局变量,需要在模块中用Public定义。
我们之前讲过Sub过程(点击查看Sub过程),和Function函数过程(点击查看Function函数过程)同理,如果写在模块中,在这个工程里任意的一个地方都可以调用,比如我们在模块中写一个求长方形面积的Function函数:
![50b77bc693d782aa23fe5c8fdcff9c17.png](https://i-blog.csdnimg.cn/blog_migrate/d36024be081a5b0654dbd9af09dd1f30.png)
然后我们在任意一个窗体都可以调用此函数:
![dea9b0c96f8ba95da9391dd7c16bd4b4.png](https://i-blog.csdnimg.cn/blog_migrate/9697ba9c494cdae9958fd274d19dd28f.png)
运行效果:
![c94a23f9b2a84b36a020a7ffcdfc098a.gif](https://i-blog.csdnimg.cn/blog_migrate/6f9f24838049a36d9385c27257059abf.gif)
Dim和Static
Dim和Static是声明变量的两种方式,他们有什么区别呢?
Dim声明的变量是动态变量,它的作用范围只限于过程内部。过程结束后,会释放这个变量,当再次开始这个过程时,这个变量的值都会被重新初始化。
Static声明的是静态变量,它不会随着过程或函数的结束而释放,需要等整个程序结束才会释放变量。
为了好理解,我们还通过实际例题来解释,比较直观。
![30fd5187f1d1efd8d43f66adc1c6f8b3.png](https://i-blog.csdnimg.cn/blog_migrate/60b6d8d76aed7149a7a51f75a41fb399.png)
我们看到:通过Dim定义的动态变量,它的生命周期只存在按钮的单击过程,按钮单击过程结束它就会被释放,再次点击按钮的时候会重新定义k,k的初始值是0,所以每次给变量k+1都是0+1=1,所以窗体上输出的值一直为1。
那么我们换做Static来声明这个变量k试一试:
![ed5b57f163374814356bf72346988639.png](https://i-blog.csdnimg.cn/blog_migrate/b7cdc76b58c5d13fa847db49b06aa557.png)
这回我们看到,通过Static声明的变量即使按钮的单击过程结束也不会被释放,所以每次单击按钮它的值都是上次的值+1,所以每次在窗体上输出都是变化的。