gpt4 book ai didi

vbscript - VBScript中的ByRef和ByVal

转载 作者:行者123 更新时间:2023-12-03 08:46:10 26 4
gpt4 key购买 nike

我在VBScript中遇到了一些奇怪的事情。在编写要通过引用传递参数的过程时,调用此过程的方式会更改参数传递的方式!

这是一个例子:

Sub IncrementByRef(ByRef Value)
Value = Value + 1
End Sub

Sub IncrementByVal(ByVal Value)
Value = Value + 1
End Sub

Dim Num
Num = 10
WScript.Echo "Num : " & Num
IncrementByRef(Num) : WScript.Echo "IncrementByRef(Num) : " & Num
IncrementByRef Num : WScript.Echo "IncrementByRef Num : " & Num
IncrementByVal(Num) : WScript.Echo "IncrementByVal(Num) : " & Num
IncrementByVal Num : WScript.Echo "IncrementByVal Num : " & Num

这是输出:
U:\>cscript //nologo byrefbyval.vbs
Num : 10
IncrementByRef(Num) : 10
IncrementByRef Num : 11
IncrementByVal(Num) : 11
IncrementByVal Num : 11

U:\>

指定通过ByVal传递参数时,无论调用该过程的方式如何,它都能按预期工作。
但是当指定参数通过ByRef传递时,如果以这种方式调用过程,它将按预期工作:
IncrementByRef Num

但不是这样:
IncrementByRef(Num)

在我看来这很奇怪。无论如何调用该过程,有没有一种方法可以确保将参数传递给ByRef?

最佳答案

Eric Lippert上有一篇很棒的文章,关于在VBScript中使用括号:
What do you mean "cannot use parentheses?"您的示例说明了他提到的要点之一,即:将ByRef参数括在括号中会将其作为ByVal传递。

简而言之,VBScript子例程调用中的括号不仅可以放在参数列表的周围,还可以放在单个参数的周围(在这种情况下,它们被强制为ByVal)。而且,如果使用Call关键字,则VBScript仅希望将参数列表括在括号中。由于IncrementByRef(Num)调用不使用Call关键字,因此VBScript将括号应用于子例程参数,并将其传递给ByVal而不是ByRef

令人困惑,但这就是它的工作方式。

关于vbscript - VBScript中的ByRef和ByVal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1537819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com