VB.NET数组的不同声明方式及两类声明方法的差异问询
VB.NET两种数组声明方式的差异解析
首先先确认你的两个理解:
- 对于第一种
Dim nos As Array的理解:基本正确。Array是VB.NET里所有数组类型的基类,这个变量确实可以指向任意类型的数组实例(不管是Integer[]、String[]还是Object[])。不过要注意,刚声明的时候nos是Nothing(未初始化的对象引用),所以直接调用GetType()会报错,必须先给它赋值一个数组实例才行,这部分你已经注意到了,很棒~ - 对于第二种声明方式的理解:有个小误区。
Dim numbers = New Integer(4) {}是靠编译器类型推断得到的变量,它的实际类型是Integer()(也就是System.Int32[]),并不是“可以指向任意创建的数组”——它只能指向同类型的Integer数组,要是你想把一个String数组赋值给它,编译器直接就会报错。同理Dim digits() = New Integer(4) {}是直接声明为Integer()类型的数组变量,同样只能接受同类型的数组实例。Dim myArray(4) As Object则是直接声明并初始化了一个长度为5的Object数组(VB.NET里括号里的数字是索引上限,所以元素数量是上限+1),它的类型是Object(),也只能指向Object类型的数组。
接下来咱们说说两种声明方式的核心差异:
类型灵活性不同
As Array声明的变量是数组的基类类型,兼容性极强,可以指向任何类型的数组(比如先赋值Integer数组,再赋值String数组都没问题)。- 直接声明为
T()(比如digits())或者类型推断的数组变量,是具体的数组类型,只能接受同类型的数组,类型严格匹配。
初始化与内存分配时机不同
Dim nos As Array只是声明了一个引用变量,不会分配数组内存,变量初始值是Nothing,必须手动赋值数组实例才能使用。- 像
Dim myArray(4) As Object这种带括号的声明,会直接创建并初始化数组实例(分配对应大小的内存),变量直接指向这个实例,不需要再手动赋值(当然之后也可以重新赋值同类型的数组)。
编译时类型检查强度不同
- 具体类型的数组变量(比如
Integer())在编译阶段就能检查类型匹配问题,避免很多运行时错误。 As Array的变量编译时不会检查赋值的数组类型,只有在运行时如果做了类型相关的操作(比如强制转换),才可能抛出类型异常。
- 具体类型的数组变量(比如
举个例子更直观:
Dim nos As Array nos = New Integer(4) {} ' 完全没问题 nos = New String(2) {} ' 也没问题,因为都是Array的子类 Dim numbers = New Integer(4) {} numbers = New String(2) {} ' 编译直接报错:无法将类型“String()”转换为“Integer()”
内容的提问来源于stack exchange,提问作者Sougata
相关产品推荐
相关产品推荐

