首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VBScript中的MsgBox "“vs MsgBox()

VBScript中的MsgBox "“vs MsgBox()
EN

Stack Overflow用户
提问于 2012-11-29 15:23:43
回答 5查看 141.4K关注 0票数 29

我正在尝试编写一个VBScript,并且我正在使用诸如随机化和MsgBox之类的函数。我很好奇使用()和不使用它们有什么不同。例如:

Randomize -此行有效。

Randomize() -此行也适用。

MsgBox "Hello world!" -这是可行的。

MsgBox ("Hello world!") -这也是可行的。

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

EN

回答 5

Stack Overflow用户

发布于 2012-11-29 17:17:07

一段可调用的代码(例程)可以是Sub (因副作用而调用)或函数(因其返回值而调用)或两者的混合。作为MsgBox的文档

在对话框中显示一条消息,等待用户单击某个按钮,并返回一个值,该值指示用户单击了哪个按钮。

MsgBox(提示、按钮、帮助文件、上下文)

表明,此例程属于第三种类型。

VBScript的语法规则很简单:

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

如果您想要向用户显示一条消息,并且需要知道用户的回复:

代码语言:javascript
复制
Dim MyVar
MyVar = MsgBox ("Hello World!", 65, "MsgBox Example")
   ' MyVar contains either 1 or 2, depending on which button is clicked.

在调用(例程作为)子时,不要使用参数 ()

如果您想向用户显示一条消息,但对响应不感兴趣:

代码语言:javascript
复制
MsgBox "Hello World!", 65, "MsgBox Example"

这种美丽的简单性被以下因素搞得一团糟:

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

代码语言:javascript
复制
>> Sub S(n) : n = n + 1 : End Sub
>> n = 1
>> S n
>> WScript.Echo n
>> S (n)
>> WScript.Echo n
>>
2
2

S (n)并不意味着“用n调用S”,而是“用n的值的副本调用S”。程序员看到了

代码语言:javascript
复制
>> s = "value"
>> MsgBox(s)

当他们尝试的时候,“作品”将会带来惊喜:

代码语言:javascript
复制
>> MsgBox(s, 65, "MsgBox Example")
>>
Error Number:       1044
Error Description:  Cannot use parentheses when calling a Sub

编译器在Sub调用中对empty ()的宽大处理。可以调用“纯”子随机化(调用用于设置随机种子的副作用)

代码语言:javascript
复制
Randomize()

尽管()既不能表示“给我你的返回值),也不能表示”通过值传递某些东西“。

代码语言:javascript
复制
Randomize n

代码语言:javascript
复制
Randomize (n)

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

s= "value“调用MsgBox(s,65,"MsgBox Example")

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

(基于What do you mean "cannot use parentheses?")

票数 27
EN

Stack Overflow用户

发布于 2012-11-29 16:51:10

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

在调用丢弃返回值的子例程或函数时,不要使用parenthesis

  • When调用赋值或使用返回值的函数将参数括在parenthesis

  • When中使用Call关键字调用子例程将参数括在括号中

因为您可能不会使用Call关键字,所以您只需要学习这样一条规则:,如果您调用一个函数并想要赋值或使用返回值,则需要将参数括在括号中。否则,请不要使用括号。

下面是一些示例:

  • WScript.Echo 1, "two", 3.3 -调用subroutine
  • WScript.Echo(1, "two", 3.3)语法error
  • Call WScript.Echo(1, "two", 3.3) -关键字调用需要parenthesis
  • MsgBox "Error" -调用函数"like“subroutine
  • result = MsgBox("Continue?", 4) -调用返回值为used
  • WScript.Echo (1 + 2)*3, ("two"), (((3.3)))的函数-调用子例程,其中的参数是由包含括号的表达式计算的(请注意,如果在参数列表中用括号将变量括起来,它会将行为从按引用调用更改为按value)
  • WScript.Echo(1)调用-显然这是这样的是一个使用括号的子例程调用,但实际上参数只是表达式(1),这往往会让那些习惯于在调用subroutines
  • I'm时必须指定括号的其他编程语言的人感到困惑,不确定如何解释您的示例。Randomize()Randomize是一个接受单个可选参数的子例程,但是即使该子例程没有任何参数,也可以使用一对空括号来调用它。对于空参数列表,VBScript解析器似乎有一个特殊的规则。然而,我的建议是避免这种特殊的构造,只调用任何子例程,而不使用parenthesis.

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

票数 10
EN

Stack Overflow用户

发布于 2012-11-30 01:22:16

您只是在函数中使用了一个参数,因此它在这两种情况下都工作得很好,如下所示:

代码语言:javascript
复制
MsgBox "Hello world!"
MsgBox ("Hello world!")

但是当你使用多个参数时,在VBScript方法中,括号将抛出一个错误,没有括号将很好地工作,如下所示:

代码语言:javascript
复制
MsgBox "Hello world!", vbExclamation

上面的代码会运行得很流畅,但是

代码语言:javascript
复制
MsgBox ("Hello world!", vbExclamation)

将抛出错误。试试这个!!:-)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13620748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档