MsgBox""vs VBScript中的MsgBox()

use*_*387 28 vbscript function

我正在尝试编写VBScript,我正在使用Randomize和MsgBox等函数.我很好奇使用()和不使用它们有什么区别.例如:

Randomize - 这条线有效.

Randomize() - 这条线也有效.

MsgBox "Hello world!" - 这很有效.

MsgBox ("Hello world!") - 这也有效.

该脚本将在具有不同Windows版本(至少是Windows XP)的多台计算机上运行.我想知道在使用这些函数时是否会遇到任何兼容性/语法问题.

Ekk*_*ner 27

可调用的代码片段(例程)可以是Sub(调用副作用/它的作用)或Function(调用其返回值)或两者的混合.作为MsgBox的文档

在对话框中显示消息,等待用户单击按钮,然后返回一个值,指示用户单击了哪个按钮.

MsgBox(提示[,按钮] [,标题] [,帮助文件,上下文])

表明,这个例程是第三种.

VBScript的语法规则很简单:

在调用(例程为a)函数时使用参数列表()

如果要向用户显示消息并需要知道用户的响应:

Dim MyVar
MyVar = MsgBox ("Hello World!", 65, "MsgBox Example")
   ' MyVar contains either 1 or 2, depending on which button is clicked.
Run Code Online (Sandbox Code Playgroud)

在调用(例程为a)Sub时不要使用参数列表()

如果要向用户显示消息并且对响应不感兴趣:

MsgBox "Hello World!", 65, "MsgBox Example"
Run Code Online (Sandbox Code Playgroud)

这种美丽的简约被搞砸了:

using()用于参数列表和强制按值调用语义的设计缺陷

>> Sub S(n) : n = n + 1 : End Sub
>> n = 1
>> S n
>> WScript.Echo n
>> S (n)
>> WScript.Echo n
>>
2
2
Run Code Online (Sandbox Code Playgroud)

S(n)并不意味着"用n调用S",而是"用n的值的副本调用S".程序员看到了这一点

>> s = "value"
>> MsgBox(s)
Run Code Online (Sandbox Code Playgroud)

当他们尝试时,"作品"令人惊讶:

>> MsgBox(s, 65, "MsgBox Example")
>>
Error Number:       1044
Error Description:  Cannot use parentheses when calling a Sub
Run Code Online (Sandbox Code Playgroud)

编译器对Sub调用中的empty()的宽容.可以调用'纯'子随机化(调用设置随机种子的副作用)

Randomize()
Run Code Online (Sandbox Code Playgroud)

虽然()既不能代表"给我你的回报价值",也不能"按价值传递东西".这里更严格一点会迫使程序员意识到差异

Randomize n
Run Code Online (Sandbox Code Playgroud)

Randomize (n)
Run Code Online (Sandbox Code Playgroud)

允许Sub调用中的参数list()的Call语句:

s ="value"调用MsgBox(s,65,"MsgBox示例")

这进一步鼓励程序员不假思索地使用().

(根据你的意思"不能使用括号?")

  • 65 ==**vbOkCancel + vbInformation**常量可在此处获取:http://www-techonthenet.com/access/constants/msgbox_args.php (5认同)
  • 我建议使用** vbOkCancel **代替硬编码65。它更具可读性。 (2认同)

Mar*_*age 10

据我所知,这些是在VBScript中调用子例程和函数的规则:

  • 调用子例程或放弃返回值的函数时,请不要使用括号
  • 在调用您指定或使用返回值的函数时,将参数括在括号中
  • 使用Call关键字调用子例程时,括号中的参数括起来

由于您可能不会使用该Call关键字,因此您只需要了解如果调用函数并想要分配或使用返回值的规则,则需要将参数括在括号中.否则,请勿使用括号.

这里有些例子:

  • WScript.Echo 1, "two", 3.3 - 调用子程序

  • WScript.Echo(1, "two", 3.3) - 语法错误

  • Call WScript.Echo(1, "two", 3.3)- 关键字Call需要括号

  • MsgBox "Error" - 调用一个"喜欢"子程序的函数

  • result = MsgBox("Continue?", 4) - 调用使用返回值的函数

  • WScript.Echo (1 + 2)*3, ("two"), (((3.3))) - 调用一个子程序,其中参数由涉及括号的表达式计算(请注意,如果在参数列表中用括号括起变量,它会改变从引用调用到按值调用的行为)

  • WScript.Echo(1)- 显然这是一个使用括号的子程序调用,但实际上这个参数只是表达式(1)而且往往会混淆那些用于其他编程语言的人,你必须在调用子程序时指定括号

  • 我不确定如何解释你的例子Randomize().Randomize是一个接受单个可选参数的子例程,但即使子例程没有任何参数,也可以使用一对空括号来调用它.似乎VBScript解析器对空参数列表有一个特殊规则.但是,我的建议是避免使用这种特殊结构,只需调用任何子程序而不使用括号.

我很确定这些语法规则适用于不同版本的操作系统.


Tom*_*Tom 1

您必须区分 VBA 中的子例程和函数...通常(据我所知),子例程不返回任何内容,并且周围的括号是可选的。对于函数,需要写括号。

至于您的示例,MsgBox 不是一个函数,而是一个子例程,因此在这种情况下括号是可选的。函数的一个例外是,当您不分配返回值时,或者当函数不使用参数时,您也可以省略括号。

这个答案更详细一些,但基本上,当您为函数提供括号并将它们留给子例程时,您应该站在保存的一边。

  • 禁止,除非您使用“Call”关键字。 (2认同)