隐式和显式声明

更新:2007 年 11 月

默认情况下,Visual Basic 编译器强制实施“显式声明”,即要求每个变量都要先声明才能使用。您可以去掉此要求并允许“隐式声明”。

Visual Basic 提供了一个控制显式声明的开关。默认情况下,此开关设置为 On,编译器强制显式声明。如果您将此开关设置为 Off,则不用声明变量就可以使用变量。

显式声明开关。 可以用以下任何方式将显式声明开关设置为 On 或 Off:

  • 在集成开发环境 (IDE) 中设置相应的项目属性。在“项目”菜单上单击“<项目名> 属性”,再单击“编译”选项卡。可以设置 Option explicit、Option strict 和 Option compare 的默认值。

  • 指定 /optionexplicit 命令行编译器选项。

  • 在代码的开头包含 Option Explicit 语句 (Visual Basic)

如果您使用 OptionExplicit 语句,该设置将重写项目属性和编译器选项设置,但只针对该语句所在的源代码文件。

性能优势。 将 OptionExplicit 设置为 On 具有在编译时(而不是在运行时)强制类型推理的优点。这将提高性能。

隐式声明

如果将 OptionExplicit 设置为 Off,可以通过仅在代码中使用变量来隐式声明变量。编译器将 Object 数据类型分配给所有隐式声明的变量。但是,如果显式声明所有变量并使用特定的数据类型,则应用程序的效率会更高。这将减少命名冲突错误和拼写错误的发生。它还允许编译器检测潜在的运行时错误,如将 Integer 赋给 Short。

潜在错误

非有意的新变量

可以编写不声明局部变量的过程。下面的示例阐释这一点。

Function safeSqrt(num)
' Make sure num is positive for square root.
    tempVal = Math.Abs(num)
    Return Math.Sqrt(tempVal)
End Function

Visual Basic 自动将 tempVal 创建为一个局部变量,您可以像已经显式声明该变量那样使用它。虽然这样很方便,但如果拼错了变量名,可能会在代码中导致细微的错误。假设您在前一个示例中写了如下过程:

Function safeSqrt(num)
' Make sure num is positive for square root.
    tempVal = Math.Abs(num)
    Return Math.Sqrt(temVal)
End Function

此代码初看上去与原来的一样。但它拼错了 Sqrt 的参数 tempVal 变量,因此编译器将另外创建一个称为 temVal 的局部变量,它不会被赋值,并且函数将总是返回零。

非有意的现有元素引用

Visual Basic 遇到一个新名称时,它无法确定您是要隐式声明一个新变量,还是拼错了现有的变量名称。因此,它尝试创建一个具有此名称的新变量。可能有某个变量或其他编程元素已经用该名称定义,而您的代码会无意中使用该名称定义。

通过使用显式声明可以避免由拼错变量名引起的问题。

显式声明

如果显式声明对包含前一示例中的 safeSqrt 过程的源文件有效,则 Visual Basic 会将 tempVal 和 temVal 视为未声明的变量,并对它们产生错误。因此,您随后应显式声明 tempVal。下面的示例阐释这一点。

Function safeSqrt(ByVal num As Double) As Double
' Make sure num is positive for square root.
    Dim tempVal As Double = Math.Abs(num)
    Return Math.Sqrt(temVal)
End Function

采用这个修改过的代码,您会立即了解问题所在,因为 Visual Basic 会针对拼错的 temVal 显示一条错误信息。鉴于显式声明有助于捕捉这些类型的错误,建议在所有代码中使用显式声明。

说明:

OptionExplicit 语句的作用范围为每个文件。该语句必须位于每个想用来控制显式变量声明的执行的源代码文件的开头。

请参见

任务

如何:修改项目属性和配置设置

概念

Visual Basic 中的无类型编程

Visual Basic 中的类型检查

作为通用数据类型的对象

有效使用数据类型

变量 (Visual Basic)

Visual Basic 命名约定

参考

数据类型摘要 (Visual Basic)

类型转换函数