三岁知老,变量看长
正如BtOfficer在《》中所说,任何一门高级开发语言,都离不开变量。通过变量,编程语言才能搬运和表达我们的小心思。变量是机器指令,语义化的第一步,却是高级开发语言进化的一大步。
想必各位读者对定义变量,早已是烂熟于心,驾轻就熟。与变量最相关的概念中,作用域,也就是作用范围算是比较突出的1个。作为变量的修饰语,有局部变量,有模块变量,更有全局变量之分。
其中,很多人又特别亲睐全局变量,BtOfficer甚至见过为了减少变量声明,而使用全局变量的。可见,全局变量的特性深得人心。但是,BtOfficer也特意检索了下互联网,对于定义全局变量的问题回答中,几乎都是新开个标准模块,定义在标准模块中。
BtOfficer在《》中说,有种懒叫VB,你不懂!要是定义个全局变量还如此颇费周章,VB/VBA也谈不上任性吧。全局变量既然如此“好用”,那定义全局变量需要注意什么?在哪儿定义?终归是要搞明白才行,那本篇就将BtOfficer自己的理解分享给大家伙。
一、全局变量变量类型概览
全局变量,顾名思义,就是整个应用程序的代码均可使用的变量,不仅跨函数代码块,还能跨线程,在应用程序(进程)整个生命周期内均有效,且具有全局唯一性。与全局变量相对的是局部变量,如函数中定义声明的变量,仅当函数调用时有效,不同函数的局部变量名可以相同。
了解函数机制的朋友,应该清楚,通常局部变量在栈上由系统自动分配所需内存,并自动回收相应内存。局部变量的生命周期,由堆栈平衡机制来巧妙实现的。而作为全局变量,其特性与局部变量迥异,自然其实现机制也是不同的。
全局变量需要在内存地址空间中,找1个固定的位置,所需内存在进程初始化的时候就分配,直到进程被销毁时才回收。唯有这样才能简单地满足全局变量的特性,否则就要使用句柄那样的复杂机制。事实上,全局变量存储于静态(通常为Data)段中,是一个非动态的概念。
二、全局变量值得关注的作用被口诛笔伐的,往往都是好东西!
1、可提升VB/VBA代码的安全性
VB/VBA编译后,全局变量可防堆栈跟踪,使得代码逻辑更加隐秘,从而加大分析难度。
2、是VB/VBA多线程中最便捷的数据同步通道
进程有进程的资源,线程也有线程的资源。不同线程数据交互时,通常比较麻烦,但进程资源是所有线程共享的,而全局变量就属于进程资源。所以,线程可通过全局变量进行非常便捷的数据同步。
3、利用写时复制,可构建出非常精巧的数据结构
写过VB程序的,对ActiveXEXE一定不陌生,在这类PE中全局变量会失效,相信也不陌生。其实,这就是写时复制。利用其特点,可以构建出多维代码逻辑空间,对于VB/VBA应用的安全保护,具有意想不到的效果。
除此外,还有很多使用场景,欢迎关注BtOfficer交流。当然,全局变量就像GOTO一样,是一柄双刃剑,只有合理利用,才有价值!不信,继续往下看。
三、全局变量只能定义在标准模块中吗?如果只能定义在标准模块中,那还值得BtOfficer来写一篇么?在展开之前,先说几句题外话。
当用户打开VB/VBA的IDE时,什么都没做的情况下,是不是就可以使用App对象、Err对象、Screen对象、Clipboard对象、Debug对象等数十个对象!
当用户想要构建应用工程,点开快捷菜单中的『插入』菜单时,用户窗体、模块和类模块选项,便位列眼前。这些是VB/VBA代码最常用的寄宿空间。用户同样不需要额外地付出什么、消息泵、接口之类的就已经躺好,等着上代码,下仔了。
这些都是VB/VBA工程全局的概念,正是这些全局因素,才让VB/VBA编程环境,变得异常轻松,这也是VB/VBA懒的一面。那些说VB/VBA语法老套的,那去看看WPS的JS宏吧。
既然,Form、模块和类模块是全局对象,那自然就可以全局访问。只不过标准模块,比较特殊,使用时通常不需要携带模块名,而其他全局对象需要携带对象名而已。事实上,规范的VB/VBA代码,使用模块对象时,都应该带上模块名。
总而言之,Form、模块和类模块,以及VBA所在宿主提供的全局对象,如Excel的Sheet对象和ThisWorkBook对象,都是可以定义全局变量的。
四、全局变量的定义位置,有哪些启示?扩展了对象
为了说明问题,先来看一段简单的演示。从该演示中,我们可以看到,公共变量扩展了公共对象实例的成员。BtOfficer在《》中说,函数包括Function函数,Sub是过程,Property属性,函数名就是1临时变量。
VB/VBA函数名与变量并无本质区别
事实上,借用上述启示,我们可以给上述全局对象增加特性、甚至覆盖已有的特性。这不比所谓Hook黑科技来得低端。若利用轻量对象,可以打包任意代码块为对象,进而有效扩展AdressOf的应用范围。
欢迎关注BtOfficer,还有更多有趣且深入的内容哦!等打好概念的基础,就要正式进入VB/VBA凶残且凶险的一面了哦。
扩展阅读:
《》