变量疑难解答 (Visual Basic)

本页列出一些当您在 Visual Basic 中使用变量时可能会出现的常见问题。

无法访问对象的成员

如果代码尝试访问对象上的属性或方法,可能会出现两种错误后果:

  • 如果将对象变量声明为某种特定类型,然后引用未由该类型定义的成员,则编译器可能会生成错误消息。

  • 在赋给对象变量的对象未公开代码尝试访问的成员时,会出现运行时 MemberAccessException。 在 Object 数据类型 变量的情况下,如果成员不是 Public,则也可能会引发此异常。 这是因为后期绑定只允许访问 Public 成员。

Option Strict 语句 将类型检查设置为 On 时,对象变量只能访问用于声明它的类的方法和属性。 下面的示例阐释了这一点。

Dim p As Object = New System.Windows.Forms.Label
Dim q As System.Windows.Forms.Label = New System.Windows.Forms.Label
Dim j, k As Integer
' The following statement generates a compiler error.
j = p.Left
' The following statement retrieves the left edge of the label 
' in pixels.
k = q.Left

在本示例中,p 只能使用 Object 类本身的成员,其中不包括 Left 属性。 另一方面,q 被声明为 Label 类型,因此它可以使用 System.Windows.Forms 命名空间中 Label 类的所有方法和属性。

s7fx2f23.collapse_all(zh-cn,VS.110).gif正确的方法

要能访问特定类的对象的所有成员,请尽可能将对象变量声明为该类的类型。 如果无法这样做(例如在编译时不知道对象类型),则必须将 Option Strict 设置为 Off,并将变量声明为 Object 数据类型。 这会允许将任何类型的对象赋给该变量,因此,您应采取措施来确保当前赋给变量的对象属于可接受的类型。 可以使用 TypeOf 运算符 (Visual Basic) 来作出此决定。

其他组件无法访问您的变量

Visual Basic 名称并不区分大小写。 如果两个名称只是在字母大小写上不同,则编译器会将它们解释为相同的名称。 例如,它将 ABC 和 abc 视为相同的已声明元素。

但是,公共语言运行时 (CLR) 使用区分大小写的绑定。 因此,当生成程序集或 DLL 并使其可用于其他程序集时,名称将不再是不区分大小写的。 例如,如果用名为 ABC 的元素定义某个类,并且其他程序集通过公共语言运行时使用该类,则它们必须用 ABC 来引用此元素。 如果以后要重新编译该类并将此元素的名称更改为 abc,则其他使用该类的程序集将无法再访问此元素。 因此,在发布程序集的更新版本时,不能更改任何公共元素的字母大小写。

有关更多信息,请参见 公共语言运行时 (CLR)

s7fx2f23.collapse_all(zh-cn,VS.110).gif正确的方法

要允许其他组件访问您的变量,请将变量的名称视为如同区分了大小写。 在测试类或模块时,请确保其他程序集绑定到您希望它们绑定到的变量。 一旦发布了组件,请勿对现有的变量名称作任何修改,包括更改它们的大小写。

使用了错误的变量

如果具有多个名称相同的变量,则 Visual Basic 编译器会尝试解析对该名称的每个引用。 如果变量具有不同的范围,则编译器会解析对范围最窄的声明的引用。 如果变量具有相同的范围,则解析将会失败,并且编译器会引发错误。 有关更多信息,请参见 对已声明元素的引用 (Visual Basic)

s7fx2f23.collapse_all(zh-cn,VS.110).gif正确的方法

避免使用名称相同但范围不同的多个变量。 如果使用其他程序集或项目,则尽可能避免使用在这些外部组件中定义的任何名称。 如果具有多个名称相同的变量,请确保限定了对此名称的每个引用。 有关更多信息,请参见 对已声明元素的引用 (Visual Basic)

请参见

任务

如何:访问对象的成员 (Visual Basic)

如何:确定对象变量引用的类型 (Visual Basic)

概念

变量 (Visual Basic)

Visual Basic 中的变量声明

Visual Basic 中的对象变量

对象变量声明 (Visual Basic)

对象变量值 (Visual Basic)

对已声明元素的引用 (Visual Basic)

已声明的元素名称 (Visual Basic)