在学生信息管理系统中我发现变量和过程的作用域问题很重要,稍不注意就可能出错。我一直认为中文起名字有时候很讲究。作用域,不言而喻就是能起到作用的区域,而对变量和过程这样的抽象实物能起到作用就表示存在生命,当程序运行到某个变量或过程不能起到作用时,该生命就结束了。这样一个生命周期的概念就比较形象地建立起来了。
下面举个例子:
'通用窗体 Public i As Integer '过程1 Private Sub Command1_Click() i = 5 Debug.Print i End Sub '过程2 Private Sub Command2_Click() Dim i As Integer i = 2 Debug.Print i End Sub
上面程序代码的运行结果估计大家都知道,不过这个小问题涉及到作用域覆盖的问题,下面我分析一下作用域和生命周期。这里的作用域问题不应该局限于VB,本人浅显的了解一点C语言的知识,发现C语言的作用域问题也是类似的。
一、过程
1、模块级过程
定义:指在某个模块内部定义sub过程或function过程时,选择private关键字。
作用域:仅限于在本模块使用,不能在定义之外的模块使用。
调用方式:在本模块直接使用。
2、全局级过程
定义:在模块中使用public来定义某个sub过程或function过程。
作用域:应用程序的任何地方都可以使用。
(1)通用窗体中的过程
外部模块需要指明该过程所在的模块。
(2)类模块中的过程
调用方式:类必须先实例化后才能使用对象,然后采用对象名.过程名的形式来调用。
(3)标准模块中的过程
调用方式:如果该过程名在工程中唯一,那么直接使用。
如果不唯一,那么必须要前置模块名。
总结:
作用域范围:类模块过程>标准模块过程>=通用窗体模块过程>模块级过程
这里感谢勇霞师傅指教的这句话:
一句话:在调用的时候,就近原则。离那个声明更近,默认就调用那个,特殊情况加前缀说明。
二、变量
使用方式:直接使用。
1、过程级变量
定义:在过程中用private或dim声明。
作用域:在该过程,内定义语句之后的范围内可以随意使用。
2、模块级变量
定义:在通用声明段中使用private或dim来声明。
作用域:所在模块可以直接使用。
3、应用程序级变量
定义:通用模块使用public声明或者是在标准模块用public声明。
作用域:整个应用程序
三、作用域的覆盖问题
这个概念是我在学C语言时第一次接受到的,不过亲身感受它的魅力还是在完成学生信息管理系统时。那什么是作用域的覆盖呢?
简单地说就是同名的两个过程或者是变量的作用域都能涉及到某个范围,但是在这个范围内只能有一变量或者过程起到作用。那么另一个变量或者作用域就会被覆盖而不能起到作用。
那么覆盖问题的原则是什么?一句话,作用域小的覆盖掉作用域大的。