【问题标题】:Is it harmful to Dim a variable more than once?对变量进行多次调暗是否有害?
【发布时间】:2014-07-30 20:06:40
【问题描述】:

这似乎是一个非常基本的问题,但我仍然找不到答案。

在 VBScript 中,用 Dim 语句多次声明同一个标量变量有什么害处吗?

我正在从事一些相关的项目并开发一些我想重用的代码片段。但是,我有点担心使用两次使用相同变量名的代码是否存在问题,如下所示:

Dim i
for i = 1 to Count
    '* doin' somethin' here
next

Dim i
for i = 1 to UnrelatedOtherCount
    '* doin' somethin' different yo
next

这也不仅仅是迭代循环变量;我可能在脚本中有多个使用正则表达式的地方。如果我的脚本使用了两个重复使用的代码部分,并且每个部分都使用“patternString”变量并从声明变量开始:

'* first section of code from the folder
Dim objPersonRegex, patternString
Set objPersonRegex = new RegExp
...

'* a completely different section of code
Dim objBuildingRegex, patternString
Set objBuildingRegex = new RegExp

我的直觉是说它不应该是个问题,Dim 只是创建一个给定名称的变量如果它不存在,并且如果确实如此,那就继续下去,因为它被告知要做的事情已经完成。但事实真的如此吗?如果重要的话,这些是在 Windows Script Host 上运行的脚本。

(为了澄清我担心的是什么,我完全担心变量的被破坏。如果我需要保留该值变量,我会将它保存在另一个变量中,一个具有唯一名称的变量。)

我自己查找答案的所有尝试都失败了;它们只返回有关在一行上声明多个变量以及在数组上使用 ReDim 的信息。

【问题讨论】:

    标签: vbscript wsh


    【解决方案1】:

    对一个变量进行多次变暗是否有害?

    不可能对一个变量进行多次调暗。 not using Option Explicit 和 (mis)using On Error Resume Next 在 'compiler '。

    【讨论】:

      【解决方案2】:

      Dim 不只是创建然后重新创建变量。它为它分配一个内存地址。 因此,假设您在 OPTION EXPLICIT 开启的情况下进行编码,它甚至不允许您这样做。

      但是...您在此处显示的示例不是再次声明变量。无论如何,不​​一样。这不是“变暗”。它只是暂时使用并在完成后丢弃。所以,在这方面,你的做法是正确的。

      如果您要为循环中运行的每一个小东西创建一个新变量,当它们不相互干扰时,这将变得相当低效。

      【讨论】:

      • 感谢您的回答。我想我没有很好地表达我的担忧(在询问了 Dim 语句之后,我忘记将 Dim 语句放入我的代码中!D'oh ...)我已经修改了我的问题以更清楚;你觉得同样的答案仍然适用吗?
      【解决方案3】:

      在第一个示例中,我会说它是有害的,因为这意味着您正在使用 OPTION EXPLICIT OFF 进行编码。 不要这样做。保持该选项开启。

      对于第二个示例,如果它们确实是不同的代码部分,在不同的“命名空间”中(尽管 vbscript 有这个概念......我猜是不同的模块),你可能没问题。但是,该代码足够相似,因此我会考虑编写一个方法来执行您将要执行的任何操作。然后只需调用该方法即可。

      但是,如果第二个示例中的 sn-ps 在同一个模块中,这将是一个问题……部分原因是我在第一段中的原因,部分原因是它可能导致一种非常特殊的错误。想象一下,您在代码中犯了一个错误,在最后一个示例中,patternString 可能以某种方式被取消分配。如果它是一个全新的变量,则会导致错误,这样我们就知道出了问题。使用当前代码,可以使用旧模式运行代码。这比错误更糟糕,因为它可能会导致程序执行一些操作,例如对数据库进行意外更改,或向错误的用户显示敏感数据。

      【讨论】:

      • 即使没有指定Option Explicit,VBScript 也会在此处引发错误。所以我猜他不仅有未指定的Option Explicit,还有On Error Resume Next。双重打击。
      • 有没有一种方法可以显式地取消声明变量呢?对 WSH 说,实际上,“我根本不再关心这个变量,所以即使你看到我声明一个同名的变量,它也是一个全新的变量”?
      • @afeldspar 是的。通过使用更短的方法和模块。
      猜你喜欢
      • 2021-05-03
      • 1970-01-01
      • 2021-07-27
      • 2020-02-14
      • 2019-10-05
      • 2013-03-14
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多