变量疑难解答 (Visual Basic)
更新:2007 年 11 月
本页列出一些当您在 Visual Basic 中使用变量时可能会出现的常见问题。
无法访问对象的成员
如果代码尝试访问对象上的属性或方法,可能会出现两种错误后果:
如果将对象变量声明为某种特定类型,然后引用未由该类型定义的成员,则编译器可能会生成错误消息。
在赋给对象变量的对象未公开代码尝试访问的成员时,会出现运行时 MemberAccessException。在 Object 数据类型变量的情况下,如果成员不是 Public,则也可能会引发此异常。这是因为后期绑定只允许访问 Public 成员。
当 Option Strict 语句将类型检查设置为 On 时,对象变量只能访问用于声明它的类的方法和属性。下面的示例阐释这一点。
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,则其他使用该类的程序集将无法再访问此元素。因此,在发布程序集的更新版本时,不能更改任何公共元素的字母大小写。
有关更多信息,请参见公共语言运行库。
正确的方法
要允许其他组件访问您的变量,请将变量的名称视为如同区分了大小写。在测试类或模块时,请确保其他程序集绑定到您希望它们绑定到的变量。一旦发布了组件,请勿对现有的变量名称作任何修改,包括更改它们的大小写。
使用了错误的变量
如果具有多个名称相同的变量,则 Visual Basic 编译器会尝试解析对该名称的每个引用。如果变量具有不同的范围,则编译器会解析对范围最窄的声明的引用。如果变量具有相同的范围,则解析将会失败,并且编译器会引发错误。有关更多信息,请参见有多个同名变量时解析引用。
正确的方法
避免使用名称相同但范围不同的多个变量。如果使用其他程序集或项目,则尽可能避免使用在这些外部组件中定义的任何名称。如果具有多个名称相同的变量,请确保限定了对此名称的每个引用。有关更多信息,请参见如何:区分两个名称相同的元素。