变量疑难解答 (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 类的所有方法和属性。
正确的方法
要能访问特定类的对象的所有成员,请尽可能将对象变量声明为该类的类型。 如果无法这样做(例如在编译时不知道对象类型),则必须将 Option Strict 设置为 Off,并将变量声明为 Object 数据类型。 这会允许将任何类型的对象赋给该变量,因此,您应采取措施来确保当前赋给变量的对象属于可接受的类型。 可以使用 TypeOf 运算符 (Visual Basic) 来作出此决定。
其他组件无法访问您的变量
Visual Basic 名称并不区分大小写。 如果两个名称只是在字母大小写上不同,则编译器会将它们解释为相同的名称。 例如,它将 ABC 和 abc 视为相同的已声明元素。
但是,公共语言运行时 (CLR) 使用区分大小写的绑定。 因此,当生成程序集或 DLL 并使其可用于其他程序集时,名称将不再是不区分大小写的。 例如,如果用名为 ABC 的元素定义某个类,并且其他程序集通过公共语言运行时使用该类,则它们必须用 ABC 来引用此元素。 如果以后要重新编译该类并将此元素的名称更改为 abc,则其他使用该类的程序集将无法再访问此元素。 因此,在发布程序集的更新版本时,不能更改任何公共元素的字母大小写。
有关更多信息,请参见 公共语言运行时 (CLR)。
正确的方法
要允许其他组件访问您的变量,请将变量的名称视为如同区分了大小写。 在测试类或模块时,请确保其他程序集绑定到您希望它们绑定到的变量。 一旦发布了组件,请勿对现有的变量名称作任何修改,包括更改它们的大小写。
使用了错误的变量
如果具有多个名称相同的变量,则 Visual Basic 编译器会尝试解析对该名称的每个引用。 如果变量具有不同的范围,则编译器会解析对范围最窄的声明的引用。 如果变量具有相同的范围,则解析将会失败,并且编译器会引发错误。 有关更多信息,请参见 对已声明元素的引用 (Visual Basic)。
正确的方法
避免使用名称相同但范围不同的多个变量。 如果使用其他程序集或项目,则尽可能避免使用在这些外部组件中定义的任何名称。 如果具有多个名称相同的变量,请确保限定了对此名称的每个引用。 有关更多信息,请参见 对已声明元素的引用 (Visual Basic)。