当前位置: 代码迷 >> VFP >> 关于变量声明的疑惑解决思路
  详细解决方案

关于变量声明的疑惑解决思路

热度:4252   发布时间:2013-02-26 00:00:00.0
关于变量声明的疑惑
经常看到一些高手在所写代码中声明变量时使用如下格式:

PRIVATE Var1, Var2
LOCAL Var1, Var2

为何要同时声明两种不同类型的同名变量?有什么好处?
我知道 Private 可用来声明并隐藏高层模块中的变量,Local 用来声明局部变量
主要是为何要使用 Private 声明?


------解决方案--------------------------------------------------------
学习~
------解决方案--------------------------------------------------------
我想他们至少都会遵循“变量使用前都应先赋初值”这条编程准则的:
在VFP中,LOCA变量初值为F
Variables and arrays created with LOCAL are initialized to False (.F.).
------解决方案--------------------------------------------------------
探讨
TO :FOXHENGXING
"PRIVATE 不会创建内存变量(PRIVATE doesn't create variables;)"
不是我说的,是VFP帮助中说的。

------解决方案--------------------------------------------------------


23 FOXHENGXING 版主,你这说法我就不同意了,private,local都是声明变量的,主要就是变量作用域的不同,没有说PRIVATE 不会创建内存变量的说法,不要误导大家。。

------解决方案--------------------------------------------------------
回帖是一种美德!每天回帖即可获得 10 分可用分! 小技巧:教您如何更快获得可用分
------解决方案--------------------------------------------------------
探讨
23 FOXHENGXING 版主,你这说法我就不同意了,private,local都是声明变量的,主要就是变量作用域的不同,没有说PRIVATE 不会创建内存变量的说法,不要误导大家。。


这个说法不对。 private 不创建变量,也不是声明变量。仅是把上层定义的变量隐藏起来对下面不可见。

------解决方案--------------------------------------------------------
学习。
------解决方案--------------------------------------------------------
a=1
=down()

Procedure Down 
LOCAL a 
PRIVATE a
a= 50 
? 'la' 
? a 
=OOK()
?'la'
?a
Return 
Endproc 

Procedure OOK 
a=a+1 
? 'OK' 
? a 
Return 
Endproc 


我尝试这样声明就不会出错!
------解决方案--------------------------------------------------------
探讨
如果是偶尔一两个函数中这样使用,且只对某几个变量这样处理,可以理解为不想后面的程序使用这些变量
但从 39 楼中列举的代码来看,不是这种目的,况且所有方法/函数都是这样声明的
这样就可能出现我 33 楼所做的假设:不利于代码升级维护,可能因添加新代码而产生意料不到的 bug
只是现在还不知高手们这样做时,是否有他们自己的编程规范来避免此问题

------解决方案--------------------------------------------------------
要敢于否认高手的写法问题!

PRIVATE 应该是原来老版本foxpro的
后来有了LOCAL,其实我觉得PRIVATE没有存在的必要呢
后来的vfp 保留了PRIVATE 是兼容需要

高手那么做的原因,是处于对LOCAL的怀疑,再加一道安全线(或者以前老的书写习惯的延续)
就好像有人喜欢在scan 面前加上go top 才能放心一样

------解决方案--------------------------------------------------------
各们高手们钻角了,其实我认为楼主的这个疑惑很对,因为像十豆三说的一样,VFP的变量只要赋值也就定义了,楼主的困惑也就出在这“不用定义就可以使用”上了,其实两句同时用而且“是AND而不是OR”是因为这样从语法角度是规范的,先藏再建,而平时只用其中一个,对于VFP好像不出问题,但对于其它语言这个习惯就不好了,肯定出问题!
虽然单独用其中一个看起来作用一样,但道理不一样,单独用PRIVATE是声明“藏”了,但没创建,只所以看到创建了,是因为后边的赋值语句造成,而不是PRIVATE,而单独用LOCAL 虽然没明着“藏”,但你不藏就要把上层已经存在的变量声明成一个局部变量,VFP就只好自己想办法把上层的“藏”了再创建一个你需要的局部变量,满足一下一个不负责人的程序员要求。
所以我觉得VFP算得上老好人一个了,大家也不用争这个了,多多支持、帮助VFP和VFPER!
------解决方案--------------------------------------------------------
最小再现环境如下:

将以下代码保存成 aa.prg,假设这个 aa.prg 是一个公用模块。
*---------------------------
* Private lcShortMenuName, lnIndex
Local lcShortMenuName, lnIndex

lcShortMenuName = Sys(2015)
lnIndex = 200

Define Popup (m.lcShortMenuName) ShortCut Relative From MRow(), MCol()

Define Bar 1 Of (m.lcShortMenuName) Prompt "菜单一"
Define Bar 2 Of (m.lcShortMenuName) Prompt "菜单二"

On Selection Bar 1 Of (m.lcShortMenuName) m.lnIndex = Bar()
On Selection Bar 2 Of (m.lcShortMenuName) m.lnIndex = Bar()

Activate Popup (m.lcShortMenuName)
Deactivate Popup (m.lcShortMenuName)
Release Popups (m.lcShortMenuName)
  相关解决方案