经常看到一些高手在所写代码中声明变量时使用如下格式:
PRIVATE Var1, Var2
LOCAL Var1, Var2
为何要同时声明两种不同类型的同名变量?有什么好处?
我知道 Private 可用来声明并隐藏高层模块中的变量,Local 用来声明局部变量
主要是为何要使用 Private 声明?
------解决方案--------------------------------------------------------
学习~
------解决方案--------------------------------------------------------
我想他们至少都会遵循“变量使用前都应先赋初值”这条编程准则的:
在VFP中,LOCA变量初值为F
Variables and arrays created with LOCAL are initialized to False (.F.).
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
回帖是一种美德!每天回帖即可获得 10 分可用分! 小技巧:教您如何更快获得可用分
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
学习。
------解决方案--------------------------------------------------------
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
我尝试这样声明就不会出错!
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
要敢于否认高手的写法问题!
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)