在窗体内定义的全局变量,是真正的全局变量吗?
理论上,窗体本身就是一个类,然后实例化这个类,就是窗体,基于这一点,在窗体内是不能有全局变量的呀。因为窗体是实例化后的一个对象呀?窗体随着对象的创建而存在,随着对象的卸载而消失。但是为什么在窗体内可以定义public类型的变量呢?
另外,如果在模块中定义全局变量,一定是在内存的数据段分配空间的,在编译时就分配好空间了。我想问,在窗体中定义的变量,是在数据段分配空间吗?还是在堆栈段分配空间。如果从窗体是对象实例这一点考虑问题,应该在堆栈段分配空间,但是如果在堆栈段分配空间,那它就不是全局变量呀。
反之,如果在数据段分配空间,那么窗体是一个实例化的对象,又做何解释呢?

解决方案 »

  1.   

    Public并非一定是"全局".只是表明,以此声明的变量/常量/过程/函数等,在"当前模块"范围以外,也可以访问.对于对象(窗体也是一对象),则表现为"公有"的属性/方法等;对于标准模块,可以看作是独立于对象的一块区域,其模块本身的作用域就是全局的,因此在这种类型的模块里声明的PUBLIC东东,就是全局访问的了.另外,不知道你所说的"在窗体内定义的全局变量,是真正的全局变量吗?"一问,从何人口中出来?哪来的"真正"与"非真正"一说呢?
      

  2.   

    两者是有区别的:例如:Form1中有public变量 iboon
    Form2 中调用bl=Form1.iboon要指明窗体的名称;但如果它在标准模块则直接bl=iboon
      

  3.   

    这么说,窗体中的全局变量,应该是类的public属性,这样理解对吗?
      

  4.   

    我来告诉你吧。窗体模块实际就是类模块。窗体里的Public变量实际就是类模块的public变量。那么类模块的public变量是啥东东啊?嘿嘿,就是类的属性啊。那么类的属性是全局变量么?嘿嘿,当然不是了。事实上,只有在标准模块以Public声明的变量才是真正的全局变量。
      

  5.   

    为何无语?说的不对吗?
    对于一个实例化的对象来说,在外部可以访问的,只有public属性呀,有什么不对吗?
      

  6.   

    没有问题,是Public,又不是Global。在模块中用Public声明的是在程序的整个生命期内都能访问到的全局变量,而在类中如果是类变量(共享变量)那么是全局的,如果是实例变量,那么是公共的,即访问作用域为全局但生命期为实例的生命期而非程序的生命期。不过偶不清除VB中有没有类变量(共享变量),呵呵。
      

  7.   

    总结:
    (1)就作用范围而言,窗体中的Public变量在应用程序中的每一处可见,它的确是"全局的";
    (2)窗体中的Public变量和标准模块中Public变量是存在很大区别,最大的区别是窗体中的Public变量要依赖于窗体实例的存在,而标准模块中Public变量在整个程序运行期都是有效的.显然,窗体中的Public变量兼有全局变量的作用范围但又具有类属性的特征.
    (3)看一看MSDN:
    Visual Basic 中的变量可以有下列范围:范围   声明位置                                                  可见位置 
    过程级 过程,子过程或函数过程中的 ‘Private’                   在声明它的过程中 
    模块级 窗体或代码模块(.frm、.bas )的声明部分中的 ‘Private’ 窗体或代码模块中的每一个过程 
    全局   代码模块(.bas)的声明部分中的 ‘Public’                应用程序中的每一处
    (4)个人认为窗体中的Public变量只是可视作"全局变量",本质上它只是类的一个接口.同样的道理本人认为只有属性过程定义的变量才是真正属性,也不承认它是属性.
    (5)道理于此,如果没有严格的定义,各种看法都有自己的侧重点,都有道理.不能简单认为自己就对别人的就错.
    上面的无语,是因为不认同全局变量等于属性的看法.
      

  8.   

    LZ,可以把VB6里面的每个你肉眼能看到的控件(包括控件)看做一个类,而有些类只是在需要的时候才会被实例化,当类一旦被引用后,类将在内存中存在,并且在你的实例化后可以使用里面的属性方法.既然是类,那么在它的属性中,就分为私有,共有,及友员(进程内共享)
      

  9.   


    自己写个类,定义一个public变量,然后编译一下,用oleview看下。
      

  10.   

    老张可以看一下这个链接
    http://topic.csdn.net/u/20090514/14/cca969e5-8ca1-442e-b966-e42923205a5b.html
    -------------------------------------------------------------------------------------
    PS:
    这些是基于我认为窗体是一个类,如果窗体不是类,那么我的观点就错了。
      

  11.   

        首先,我没说过谁错,我也知道窗体是类,我也学过类属性可用Public变量定义,我也知道Public变量有可能是编译时编译器加了属性过程,那么我们定义类属性时为什么不只要Public就行了呢,因为它不规范,所以我不认为它是属性,是我个的看法,别人认为它是属性,书上也认为它是属性,都对,都没问题,类接口除了属性方法事件还有什么呢,没了,不是属性也不行,可我就是感觉它与标准属性有区别,个人看法它是一个介于公共变量与类属性中间的一个东西,是个四象又四不象的东西,这就是我的看法,它既是属性又不是很标准属性,它既是公共变量又不是标准模块那样的标准的公共变量,这是只是我个人的看法,它既不能等同于公共变量,又不是标准属性,请不要引经据典,因为我不承认那些东西,我只是根据实情作出我自己的判断.也正是因为它是个四不象的东西,才会出现争议,才会有此贴出来.
      

  12.   

    这么说,窗体中的全局变量,应该是类的public属性,这样理解对吗?
    楼主的这个问题只问对不对,没问是不是公共变量,COM中也没有公共变量的说法。我这里没有提到公共变量,请不要偷换概念,谢谢。1)就作用范围而言,窗体中的Public变量在应用程序中的每一处可见,它的确是"全局的"; 
    我在21楼引用你的那段文字,其中的1.2两点不该分开,窗口类内的Public变量根本就不是应用程序内每处可见。