多维数组和锯齿数组(jagged arrays)是 Visual Basic 中处理集合的两种不同结构。最初 VB(VB6,.NET)只支持矩形(二维、三维)数组。后来,在 .NET 中出现了将锯齿数组作为单独对象的支持。
传统多维数组(例如,Dim matrix(2,3) As Integer)在数据表必须是矩形时非常有用。锯齿数组(jagged)是在 VB.NET 中引入的,支持创建不规则行:内部数组的元素数量可以不同。
错误的选择方法会导致内存使用不高效(例如,对于矩形数组,所有行都是固定的),或者访问元素的逻辑不正确(可能会导致超出范围的访问错误)。常常会混淆语法和初始化方法。
当内容始终满时(例如,游戏场地),选择矩形(multidimensional)数组。锯齿数组适用于行长度不同的情况(例如,不同班级的学生列表)。访问元素的方式也有所不同。
代码示例:
' 多维数组 Dim rect(1, 2) As Integer ' 2 行,3 列(从零开始索引) rect(0,0) = 1 : rect(0,1) = 2 : rect(0,2) = 3 rect(1,0) = 4 : rect(1,1) = 5 : rect(1,2) = 6 ' 锯齿数组 Dim jagged(2)() As Integer ' 由 3 个元素组成的数组,每个元素都是一个数组 jagged(0) = New Integer() {1, 2} jagged(1) = New Integer() {3, 4, 5} jagged(2) = New Integer() {6} Console.WriteLine(rect(1,2)) ' 6 Console.WriteLine(jagged(1)(2)) ' 5
关键特点:
可以使用 Dim a(2,3) As Integer 定义锯齿数组吗?
回答:不,这会创建一个矩形数组。锯齿数组可以这样定义:Dim a(2)() As Integer 或 Dim a As Integer()() 。
如果不初始化锯齿结构的内部数组而尝试访问元素,会发生什么?
回答:会抛出 NullReferenceException 异常,因为内部数组未创建。
获取一维数组和锯齿数组长度的语法有什么区别?
回答:对于矩形数组:a.GetLength(0)(行数),a.GetLength(1)(列数)。对于锯齿数组:a.Length(行数),a(i).Length(第 i 行的元素数量)。
为了存储按班级列出的学生,选择了矩形数组(10, 30)——未使用的空元素,部分班级少于最大学生人数。
优点:
缺点:
使用锯齿数组:每个内部数组是班级的实际学生列表,内存优化和处理简单。
优点:
缺点: