关于变量声明的疑惑

都市夜猫 2009-06-26 12:49:36
加精
经常看到一些高手在所写代码中声明变量时使用如下格式:

PRIVATE Var1, Var2
LOCAL Var1, Var2

为何要同时声明两种不同类型的同名变量?有什么好处?
我知道 Private 可用来声明并隐藏高层模块中的变量,Local 用来声明局部变量
主要是为何要使用 Private 声明?
...全文
520 73 打赏 收藏 转发到动态 举报
写回复
用AI写文章
73 条回复
切换为时间正序
请发表友善的回复…
发表回复
xcntime 2012-02-28
  • 打赏
  • 举报
回复
70多层楼的回答,看了一遍,貌似还是不明晰啊
esnake 2011-02-14
  • 打赏
  • 举报
回复
我最关心的是,能不能强制变量必需声明?
狂龙骄子 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 dkfdtf 的回复:]
刚才看到狐狸天堂的 xinjie(都认识吧)留言,原来 myf1 上很早就有人提出过这个问题
从讨论的结果来看,问题原由和我猜想的基本一致
此情况都出自 on ... cmmmand 这类语句

1. on selection bar/pad/... 这类语句
以前在 foxpro for dos 中只能这样建菜单,现在 vfp 在 Windows 环境下有大量好用的第三方 Active……
[/Quote]

第1点:
1、支持用 DO p_UserProc 方式(俾人使用此方法4年有余:不但能减少代码冗余,使用、修改也很方便);
2、通过用 Public 定义的变量,来控制 某菜单(项) 的 激活/失效,也是很不错的选择(虽没有 VC++中 对 ID 的 控制方便,但也是首选);
3、05年从 DOS 转入 VF x.0 系列后,都很少使用 Private 定义变量(都用Local、Public)。
love2008cn 2010-01-27
  • 打赏
  • 举报
回复
对于新狐上路兄举的例子是可以解释的,测试如下
lnIndex = 100
aa()
?lnIndex &&显示菜单项 1 或2 或100
MESSAGEBOX显示200
再看
LOCAL lnIndex
lnIndex = 100
aa()
?lnIndex &&显示100
MESSAGEBOX显示菜单项 1 或2 或200
可以看到在第一个例子中菜单项的返回值被高一级作用域的变量给勾走了:)
说明On Selection的返回是没有考虑优先级的


TX_HD 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 yrt888 的回复:]
感觉就是好像用力关门,听到平常熟识的关门声音(LOCAL val1,val2 ),为了心安理得,还是摇了几下门(Private val1,val2 ),看看关好了没有!

[/Quote]


我菜菜地以为这是正解~
捧剑者 2010-01-03
  • 打赏
  • 举报
回复
hehe
紫寒尺 2009-09-11
  • 打赏
  • 举报
回复
学习了~~
lj_lt 2009-06-29
  • 打赏
  • 举报
回复
hehe

yrt888 2009-06-28
  • 打赏
  • 举报
回复
难道看不明!
ydks_qz 2009-06-28
  • 打赏
  • 举报
回复
什么乱七八糟的~~~
都市夜猫 2009-06-27
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 ydks_qz 的回复:]
最小再现环境如下:
...
运行 a .prg,结果很是令人吃惊甚至可以用诡异来形容 ...
[/Quote]

非常非常的感谢新狐上路兄弟的重现示例!!!

试了一下,确实感到十分蹊跷,难道是一个从未听说过的 vfp.bug?
这个重现中的情况似乎违反了 vfp 中同时存在 Local 和 Private 两个同名变量时 Local 优先的原则
需要再分析一下

再次感谢新狐上路兄弟!
Ak混子 2009-06-27
  • 打赏
  • 举报
回复
不会,等高手,看看有什么好的办法
十豆三 2009-06-27
  • 打赏
  • 举报
回复
51 楼 ydks_qz 的解释验证我 40 楼的理解。

所以我还是认为这样写是规范的,合理的


TO:dkfdtf
你 48 楼的例子,只能说明后来的程序员修改不小心,并不是同时使用不合理。因为如果后来的程序员用了其中一个,虽然可能不报错,但可能造成的结果更不可思议(结果是错的,而不是程序报错),甚至更不好查错。
yjrryyx 2009-06-27
  • 打赏
  • 举报
回复
青蛙跳水:
yjrryyx 2009-06-27
  • 打赏
  • 举报
回复
青蛙跳水:
http://p.blog.csdn.net/images/p_blog_csdn_net/yjrryyx/EntryImages/20090627/2e6fa7388b6410e4d56225ff.jpg
cbl518 2009-06-27
  • 打赏
  • 举报
回复
在子程序Z1中,直接给p001=2,其结果在 Z2 子程序Z1中,p001 变量显示为 2

CLEAR
p001=1
Z1()
?"主程序的值:"+STR(p001)
RELEASE p001

FUNCTION Z1
PRIVATE p001
p001=2
Z2()


FUNCTION Z2
?IIF(VARTYPE(p001)="U","p001变量不存在!","Z2的值:"+STR(p001))
cbl518 2009-06-27
  • 打赏
  • 举报
回复

在子程序Z1中,使用了 LOcaL 语句,其结果在 Z2 子程序Z1中,p001 变量不存在!

CLEAR
p001=1
Z1()
?"主程序的值:"+STR(p001)
RELEASE p001

FUNCTION Z1
PRIVATE p001
LOCAL p001

p001=2
Z2()


FUNCTION Z2
?IIF(VARTYPE(p001)="U","p001变量不存在!","Z2的值:"+STR(p001))
cbl518 2009-06-27
  • 打赏
  • 举报
回复
PRIVATE


不但隐藏了,上级程序中同名的内存变量,而且对其,调用的下级子程序时,依然隐藏。

p001=1
Z1()
?p001
RELEASE p001

FUNCTION Z1
PRIVATE p001
p001=2
Z2()

FUNCTION Z2
?IIF(VARTYPE(p001)="U","p001变量不存在!",p001)
都市夜猫 2009-06-27
  • 打赏
  • 举报
回复
刚才看到狐狸天堂的 xinjie(都认识吧)留言,原来 myf1 上很早就有人提出过这个问题
从讨论的结果来看,问题原由和我猜想的基本一致
此情况都出自 on ... cmmmand 这类语句

1. on selection bar/pad/... 这类语句
以前在 foxpro for dos 中只能这样建菜单,现在 vfp 在 Windows 环境下有大量好用的第三方 ActiveX 可用,我一直
用 CodeJock 的 Xtreme SuitePro 来做菜单,任务面板,工具条,状态栏,一个 ocx 全部搞掂。
一定要用的话,不要直接在 command 处写赋值语句,要调用一个函数或 do 语句,vfp 的帮助中也是这样建议的。
2. on key label
用 fpd 时大量使用,在 browse 窗口中按键执行类似 Windows 工具栏按钮的功能,vfp 中不再使用
3. on error
自从 vfp 有了 try ...catch ... endtry 结构语句后,不再使用 on error

所以对我来说,是否同时声明 Private 和 Local 不再重要
总算搞清楚这个问题了

感谢前面各位的参与,特别是 ydks_qz, xinjie 两位高手的指点
也要感谢豆三版主推荐此贴,让更多的人了解这颗隐藏的炸弹


ertyqw 2009-06-27
  • 打赏
  • 举报
回复
up
加载更多回复(52)

2,722

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧