File 当使用VBScript读取txt文件时,为什么要使用Const concorreding?

File 当使用VBScript读取txt文件时,为什么要使用Const concorreding?,file,vbscript,File,Vbscript,我注意到其他人使用ForReading而不是concorred其他代码,但我尝试了,它们似乎不能互换。这两者有什么区别?我是VBScript的新手,如果这是一个明显的问题,很抱歉。我在以下方面使用它: Option Explicit Const conForReading = 1; 'Declare variables Dim objFSO, objReadFile, contents 'Set Objects Set objFSO = CreateObject("Scripting.Fil

我注意到其他人使用ForReading而不是concorred其他代码,但我尝试了,它们似乎不能互换。这两者有什么区别?我是VBScript的新手,如果这是一个明显的问题,很抱歉。我在以下方面使用它:

Option Explicit

Const conForReading = 1;
'Declare variables
Dim objFSO, objReadFile, contents

'Set Objects
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objReadFile = objFSO.OpenTextFile("C:\Users\ali\Desktop\Tests\ToRead.txt",1, False)

非常感谢您的澄清。

常量提供了一种方便的方法,可以使用特定的值(而不是它们的文字值),而无需实际记住值本身。使用常量还可以使代码更具可读性和可维护性

有些常量已经在
VBScript
中定义,您不需要在代码中显式声明它们。只需使用它们来代替它们所代表的值。以下是VBScript中提供的各种类型的常量,以及每种常量的简要说明(附示例):

  • 颜色常量:脚本中可以使用的八种基本颜色(例如
    vbRed
    vbCyan
    ,…)
  • 比较常数:用于比较字符串(
    vbBinaryCompare
    vbTextCompare
  • 日期和时间常数:由各种日期和时间函数(
    vbFriday
    ,…)使用
  • 日期格式常量:用于格式化日期和时间(
    vbLongDate
    vbShortTime
    ,…)
  • MsgBox常量:在MsgBox函数中用于描述按钮可见性、标签、行为和返回值(
    vbOKOnly
    vbOK
    ,…)
  • 字符串常量:字符串操作中使用的各种不可打印字符(
    vbTab
    vbNewLine
    ,…)
  • 三态常数:与格式化数字的函数一起使用
  • VarType常量:各种变量子类型(
    vbNull
    vbDate
    ,…)
  • 不能方便地归入任何其他类别的杂项常量(
    vbObjectError
遗憾的是,
VBScript
没有使用枚举常量(即预定义的数据结构,如
typedef enum browsernavstants
,例如
navopeninnewindow
navOpenInNewTab
,…):您必须(更好)在代码中明确定义它们:

Const navOpenInNewWindow=&h01, navOpenInNewTab=&h0800
或者(更糟糕的是)使用数字文字值(
&h01
&h0800
,…)代替常量名称

最终,您可以定义自己的常量,并根据自己的喜好命名它们:

'various useful constants
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const OpenAsDefault = -2  ' Opens the file using the system default.
Const OpenAsUnicode = -1  ' Opens the file as Unicode.
Const OpenAsUSAscii =  0  ' Opens the file as ASCII.
Const DontCreate =  False ' do not create a new file if doesn't exist
Const CreateFile =  True  ' create a new file if the specified filename doesn't exist

Const RabbitEars = """"

'Registry Data Types and Corresponding Values'
Const _
REG_NONE      = 0 , _
REG_SZ        = 1 , _
REG_EXPAND_SZ = 2 , _
REG_BINARY    = 3 , _
REG_DWORD     = 4 , _
REG_MULTI_SZ  = 7

'Registry Subtrees and Corresponding Hexadecimal Values'
Const _
HKEY_CLASSES_ROOT   = &H80000000 , _
HKEY_CURRENT_USER   = &H80000001 , _
HKEY_LOCAL_MACHINE  = &H80000002 , _
HKEY_USERS          = &H80000003 , _
HKEY_CURRENT_CONFIG = &H80000005 , _
HKEY_DYN_DATA       = &H80000006

'Abbreviated names for Registry Subtrees
Const HKCR = &H80000000 'HKEY_CLASSES_ROOT
Const HKCU = &H80000001 'HKEY_CURRENT_USER
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Const HKUS = &H80000003 'HKEY_USERS
Const HKCC = &H80000005 'HKEY_CURRENT_CONFIG
Const HKDD = &H80000006 'HKEY_DYN_DATA

OpenTextFile方法支持多个修饰符以实现不同的目标。 第二个名为“iomode”的参数指定是读取、覆盖还是附加文件。 由于vbscript中没有枚举类型,因此这是通过整数区分的。 如你所见

虽然从程序的角度来看,将1、2和8作为参数是非常好的,但这对人类来说有点问题。如果你阅读了其他人的代码(甚至是你自己的代码),你就会看到

... OpenTextFile( "....", 1, ...)
你可能真的不知道1在那里意味着什么。因此,人们认为为名为ForReading的变量定义一个变量是一个好主意,这只会使代码更容易理解。如果你这样做了,你可以写:

... OpenTextFile( "....", ForReading, ...) 
并立即知道发生了什么,尽管解释器的代码保持不变。 现在,正如JosefZ指出的,已经有一些预定义的常量,但这3个不在其中。因此,您可以自己定义它们(正如我链接的msdn页面上的示例所示)

之所以使用常量而不是变量,是为了防止在意外更改这些变量的值时出现编程错误。如果“ForReading”不是1,那么它就没有任何意义。因此,作为一个常量,如果您试图更改该值,脚本引擎将向您发出警告

现在有些人按照惯例标记它们的常量,所有常量都以“con”开头,这样他们就可以在代码中轻松地识别它们

这就是为什么有ForRead和conForReading的基本原因。然而,情况是一样的。你可以随意调用它,重要的是它的值为1,并且你使用你定义的值。如果在脚本中定义了conForReading,则不能在函数调用中使用ForReading

其他人也总是定义这3个常量

Const ForReading = 1, ForWriting = 2, ForAppending = 3
哪怕只有一个。这可能会让初学者感到困惑,因为如果这些常量甚至没有被调用,那么这些常量似乎是必需的。他们这样做的原因可能是因为他们要么只是从某个示例或另一个程序中复制代码,要么是为了完整性,以便能够很好地记录函数中可能使用的内容。另一个原因可能是,在一个更大的脚本中,您可能无论如何都需要它们,如果您在开始时包含它们,您永远不会犯使用一个而没有定义它的错误

至于您的示例代码:
您在函数调用中根本没有使用常量,因此如果您不使用它,它甚至不会更改某些内容。

非常感谢!这确实澄清了我的问题。对于那些研究这个问题并寻求确切答案的人来说,这是“一些人通过遵循惯例来标记他们的常数,所有人都以“con”开头“因此,他们可以在代码中轻松识别它们。这就是为什么有ForRead和conForReading的基本原因。然而,情况是一样的。你可以随意调用它,重要的是它的值为1,并且你使用你定义的值。如果在脚本中定义了conForReading,则不能在函数调用中使用ForReading。“
Const ForReading = 1, ForWriting = 2, ForAppending = 3