讨论全局变量!主要解答者: guestman

unit  Unit1;  
 
interface  
 
uses  
   Windows,  Messages,  SysUtils,  Classes,  Graphics,  Controls,  Forms,  Dialogs;  
 
type  
   TForm1  =  class(TForm)  
       Button1:  TButton;  
       procedure  Button1Click(Sender:  TObject);  
   private  
       {  Private  declarations  }  
   public  
       int_a:int;//***1  
       {  Public  declarations  }  
   end;  
 
var  
   Form1:  TForm1;  
   int_b:int;//***2  
 
implementation  
 
{$R  *.DFM}  
var  
int_c:int;//***3  
 
procedure  TForm1.Button1Click(Sender:  TObject);  
begin  
//do  something  
end;  
 
end.  
全局变量大家一定用的很多,但是它却可以在多个地方进行定义(或许有一个或者几个地方定义是错误的),我以上面的一个最基本的unit为例子,在打星号的1,2,3三个地方我都可以定义全局变量。我认为,三者是有区别的,区别在于,1,2两个地方定义的,其他unit可以用到,而3定义的只有在本unit中使用。到底1,2有何区别?或者还有什么其他的区别?还望大家一起讨论!  
---------------------------------------------------------------  
 
位置1处定义:是类TForm1的变量,如果本单元中有其他的类或者其他单元,那么在其过程中引用时要先写出"form1."。  
位置2处定义:是本单元的变量,所以本单元内所有的类或者其他单元(当然要引用本单元)都可以直接引用。  
     以上为本人愚见,请不吝赐教!  
---------------------------------------------------------------  
 
1定义的全局变量有你的窗体对象来维护的,而2定义没有人去维护它(单元文件维护),定义到1的地方有好处,至少满足对象的概念!我不喜欢用全局变量,我会用全局对象来代替全局变量这个概念,虽然创建一个对象,和创建一个变量是不同的,而且效率也不一样,但容易更改程序,方便维护  
---------------------------------------------------------------  
 
建议看看Delphi帮助《Object  Pascal  Reference》中有关作用域(Scope)的帮助主题,会有很大帮助的。俺贴一小段:  
 
命名冲突  
当一个块封装了另一个块时,前者叫做外部块,后者叫做内部块。如果声明在外部块中的标识符又在内部块中重新声明(同名),那么在整个内部块中,内部块声明的标识符将忽略外部块中的声明(也就是说,编译器在整个内部块中都将该标识符作为内部块的声明解释和使用)。例如,如果在单元的接口节声明了变量MaxValue,然后在单元中的某个函数中声明了同名变量,并且在函数块中引用时没有冠以任何限定词,那么函数块中对MaxValue的引用将解释为局部变量,即函数中的声明。同样,函数中如果创建了另一个函数,在外部作用域中使用的标识符,在内部域中也可以重新声明同名的局部变量(见当前主题编者注中的过程和函数的嵌套定义)。  
 
多重单元引用使作用域的定义变得更为复杂。列在uses子句中的每个单元都强制增加了一个新的作用域,该作用域封装了被使用的其他单元、程序以及包含在该单元uses子句中的单元。uses子句中的第一个单元表示了最外层的作用域,紧接其后的单元表示了在该作用域内的新的作用域。如果在两个或更多单元的接口节中声明了相同标识符,那么当引用该标识符而没有冠以限定词时,将选择最内层作用域中的声明,也就是说,选择引用该标识符的单元,或者,如果该引用该标识符的单元中没有对其声明,那么将选择在单元uses子句的单元列表中最后一个声明了该标识符的单元。(见当前主题编者注中的接口节中uses子句对作用域的影响和接口节和实现节中uses子句对作用域的影响)  
 
Borland提供的System单元自动被每个程序或单元使用。System单元中的所有声明和编译器能自动识别的预定义类型、例程、常量等一起,总是作为最外层的作用域。(见当前主题编者注中的唯一特殊的System单元)  
 
可以通过使用冠以限定词的标识符(见限制标识符)或with语句(见With语句)来超越上述作用域规则从而绕过内层作用域的声明。  
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值