VB.NET学习笔记:数据类型——数组的定义和使⽤(动态数组、⼆维数组)官⽅帮助页⾯:
VB.NET中,可以使⽤变量储存数据,例如储存学⽣姓名:
dim strname as string="张三"
可以声明多个变量来储存三年级1班全部学⽣姓名,为了⽅便,给每个学⽣编了号:
dim 三年级1班_1 as string="张三"
dim 三年级1班_2 as string="李四"
dim 三年级1班_3 as string="王五"
dim 三年级1班_4 as string="⿇⼆"
……
虽然可⾏,但很⿇烦,⽽且使得代码难以维护和扩展,万⼀该班学⽣有增减则需要对应⽤程序进⾏修改、 重新编译和重新部署。
⼀、⼀维数组
通过使⽤⼀个数组,可以通过相同的名称、不同的索引来储存和访问以上的多个变量:
'声明
Dim 三年级1班(3) As String
'赋值
三年级1班(0) = "张三"
三年级1班(1) = "李四"
三年级1班(2) = "王五"
三年级1班(3) = "⿇⼆"
'访问
For int As Integer = 0 To 3
Console.WriteLine("三年级1班" & (int + 1).ToString & "号学⽣的姓名:  " & 三年级1班(int))
Next
测试结果如图:
该⽰例执⾏三项操作:
1、它声明了⼀个具有4个元素的数组“三年级1班(3)”。 声明数组中括号⾥的数字3表⽰数组中的最后⼀个索引。
2、它将值赋给数组中的每个元素。 通过使⽤数组名称并在括号中包含单个元素的索引访问数组元素。
3、它列出了数组的每个值。 该⽰例使⽤ For 语句按索引号来访问数组的每个元素。
⼆、⼆维数组
如果需要储存三年级全部班级的学⽣姓名,可以使⽤⼆维数组,这跟Excel存储数据很相似。
Excel以⼆维表的⽅式存储数据,⼯作表名“三年级”相当于数组名称,每⾏存储⼀个班级的学⽣姓名,单元格地址(如:C3,也可以⽤数字[3,3]表⽰)相当于数组元素的索引。
通过“⼯作表名(⾏号,列号)”访问Excel数据,如:三年级(3,3),⼆维数组也是按这样的⽅法访问数组⾥的元素。如下代码:
'声明⼀个3⾏4列⼆维数组
Dim 三年级(2, 3) As String
'为第⼀⾏的各列赋值(1班学⽣姓名)
三年级(0, 0) = "张三"
三年级(0, 1) = "李四"
三年级(0, 2) = "王五"
三年级(0, 3) = "⿇⼆"
'为第⼆⾏的各列赋值(2班学⽣姓名)
三年级(1, 0) = "赵钱"
三年级(1, 1) = "孙⼩"
三年级(1, 2) = "王⼆"
三年级(1, 3) = "秦⼤"
'为第三⾏的各列赋值(3班学⽣姓名)
三年级(2, 0) = "李⼀"
三年级(2, 1) = "赵⼆"
三年级(2, 2) = "钱三"
三年级(2, 3) = "孙四"
'访问
For int1 As Integer = 0 To 2 '⾏
For int2 As Integer = 0 To 3 '列
Console.WriteLine("三年级" & (int1 + 1).ToString & "班第" & (int2 + 1).ToString & "号学⽣的姓名:  " &
三年级(int1, int2) & "  ,索引号为: (" & int1.ToString & "," & int2.ToString & ")")
Next
Next
测试结果如图:
可见,使⽤数组⽐直接声明多个变量更简单,那到底什么是数组呢?
三、数组的概念
数组其实就是⼀个特殊的变量,其表⽰⼀组数据的集合。在 VB中,允许将多个类型相同或者不相同的数据组合成⼀个集合,它们有共同的变量名,然后⽤其索引号访问其每个元素,该集合称为数组。
1、数组的声明
使⽤数组,⾸先应声明数组。数组的声明与声明⼀个单独的变量相似:
'声明变量
Dim arr As String
'声明⼀维数组
Dim arr1(3) As String
'声明⼆维数组
Dim arr2(2, 3) As String
'声明三维数组
Dim arr3(2, 2, 3) As String
数组的声明⽐变量的声明多了⼀个括号,括号⾥写上该数组的最⼤索引号;若是声明⼆维或多维数组,
各维最⼤索引号数字⽤逗号分割。除了可以⽤Dim关键字声明数组外,声明数组还可以使⽤Public或Private关键字。声明使⽤的关键字不同将会影响数组的⽣命周期,Dim 关键字主要⽤于声明过程级别的私有数组,Private关键字⽤于声明模块级或类级别的数组,Public关键字则是在模块的声明部分建⽴⼀个公共数组,这跟变量的作⽤域相似。
旧VB6.0数组索引号的开始值可以由编程者定义(如 -1 TO 5),但VB.NET数组的索引总是从0开始到最⼤索引号的连续整数,也就是说数组元素的个数总是⽐最⼤索引号多1,所以声明时不需要也不能⽤TO关键字来声明索引号范围。
还可以使⽤New⼦句来声明数组:
'⼀维
Dim cargoWeights() As Double = New Double(9) {}
'⼆维
Dim hourlyTemperatures(,) As Integer = New Integer(23, 1) {}
'三维
Dim januaryInquiries(,,) As String = New String(30, 20, 2) {}
使⽤New⼦句时必须使⽤⼤括号{},且不能在数组变量声明中指定维的长度。
2、数组的赋值
声明数组后,就可以通过索引号来引⽤数组中的元素,为数组赋值或访问数组中元素,以上已有说明,这⾥略过。
也可以声明数组的同时为数组赋值。
⼀维数组:
Dim str1 As String() = {"%", "&", "@"}
Dim str2() As String = {"%", "&", "@"}
Dim str3 As String() = New String(2) {"%", "&", "@"}
Dim str4() As String = New String(2) {"%", "&", "@"}
需要注意:1、提供的元素值必须包含在⼤括号 {}内;2、不能在数组变量声明中指定维的长度。数组会根据元素值的数量推断数组的⼤⼩。
writeline输出数值变量
每个语句执⾏后,将创建的数组长度为 3、索引号从0 到 2、已赋初始值的数组。
⼆维数组:
Dim str1 As String(,) = {{"0-0", "0-1", "0-2"}, {"1-0", "1-1", "1-2"}, {"2-0", "2-1", "2-2"}}
Dim str2(,) As String = {{"0-0", "0-1", "0-2"}, {"1-0", "1-1", "1-2"}, {"2-0", "2-1", "2-2"}}
Dim str3 As String(,) = New String(2, 2) {{"0-0", "0-1", "0-2"}, {"1-0", "1-1", "1-2"}, {"2-0", "2-1", "2-2"}}
Dim str4(,) As String = New String(2, 2) {{"0-0", "0-1", "0-2"}, {"1-0", "1-1", "1-2"}, {"2-0", "2-1", "2-2"}}
提供的元素值必须嵌套在⼤括号{}内 。 {“0-0”, “0-1”, “0-2”}这个表⽰第1⾏,“0-0"表⽰第1⾏第1列的值为"0-0”。如图:
3、数组的属性与⽅法
每个数组都继承⾃ System.Array 类,可以使⽤System.Array 类提供⼀些属性和⽅法,⽤于获取数组维数、⼤⼩、最⼤索引号等。(1)、Rank属性
获取 数组的维数。 例如,⼀维数组返回 1,⼆维数组返回 2,依次类推。
(2)、Length和LongLength属性
获取所有维数中元素的总数。Length返回32位整数,LongLength返回64位整数。
(3)、GetLength和GetLongLength⽅法
获取数组中指定维中的元素数。GetLength返回32位整数,GetLongLength返回64位整数。
(4)、GetLowerBound⽅法
获取数组中指定维度第⼀个元素的索引。返回32位整数。
(5)、GetUpperBound⽅法
获取数组中指定维度最后⼀个元素的索引(32位整数)。如果指定维度为空则返回-1。
⽰例代码:
Dim arr(,) As String = {{"0-0", "0-1", "0-2"}, {"1-0", "1-1", "1-2"}, {"2-0", "2-1", "2-2"}}
Dim intRank As Integer = arr.Rank '获取维数
Dim intLength As Integer = arr.Length '获取所有维数中元素的总数
'嵌套循环每⼀维度(从第⼀个元素索引号到最后⼀个元素索引号)
For int1 As Integer = arr.GetLowerBound(0) To arr.GetUpperBound(0)
For int2 As Integer = arr.GetLowerBound(1) To arr.GetUpperBound(1)
Console.WriteLine("(" & int1.ToString & "," & int2.ToString & ")    " & arr(int1, int2))
Next
Next
'也可以不使⽤嵌套循环获取元素值
For Each arr1 As String In arr
Console.WriteLine(arr1)
Next
还有很多的其他⽅法请⾃⾏参考官⽅帮助。
三、动态数组
有时在程序运⾏之前⽆法确认数组的⼤⼩,需要在程序运⾏时动态决定数组⼤⼩,称为动态数组。
1、动态数组的声明
跟⼀般的数组声明⼀样,只是在括号内不必填写各维的最⼤索引号(留空)。如
'声明⼀维动态数组
Dim arr1() As Integer
'声明⼆维动态数组
Dim arr2(,) As Integer
声明动态⼆维数组需要在括号⾥⽤,号,这跟旧VB6.0的声明不⼀样,旧VB6.0不需要关⼼维数,只要是动态数组都是如下声明:
'声明动态数组(⼀维、⼆维等)
Dim arr1() As Integer
2、使⽤ReDim语句动态分配数组⼤⼩
使⽤ ReDim 语句可以更改某个已声明数组的⼀个或多个维度的⼤⼩。语法:
ReDim [ Preserve ] name(boundlist) [ , name(boundlist) [, … ] ]
参数:
Preserve ——可选。 修饰符,当仅更改最后⼀个维度的⼤⼩时,⽤来保留现有数组中的数据。
name——必须的。 数组变量的名称。 请参阅声明的元素名称。
boundlist——必须的。 列出重新定义的数组各个维度的边界。
'分配⼤⼩
ReDim arr1(1)
ReDim arr2(1, 1)
仅可在过程级别使⽤ ReDim语句,ReDim 语句可以改变各维元素的个数,但⽆法更改数组变量或其元素的数据类型,也不能更改数组的维数,更⽆法为数组元素提供新的初始化值(使⽤数组元素的数据类型的默认值来初始化这些元素)。
如果想改变数组的⼤⼩但⼜想保留原有数据,可以使⽤ Preserve,但只能调整数组最后⼀个维度的⼤⼩。 对于其他每个维度,必须指定现有数组的边界。如:
ReDim Preserve arr1(2)
ReDim Preserve arr2(1, 2)
关于⽤或不⽤Preserve关键字的区别,请看以下完整⽰例代码:
'声明⼀维动态数组
Dim arr1() As Integer
'声明⼆维动态数组
Dim arr2(,) As Integer
'分配⼤⼩
ReDim arr1(1)
ReDim arr2(1, 1)
'赋值
For Each int As Integer In arr1
arr1(int) = int + 1
Next
For int1 As Integer = 0 To arr2.GetUpperBound(0)
For int2 As Integer = 0 To arr2.GetUpperBound(1)
arr2(int1, int2) = int1 + int2
Next
Next
'重新分配⼤⼩,请单步执⾏,观察Preserve关键字的作⽤
ReDim Preserve arr1(2)
ReDim Preserve arr2(1, 2)
ReDim arr1(3)
ReDim arr2(2, 3)
四、使⽤数组的注意事项
1、维度长度:
每个维度的索引是基于 0 的这意味着其范围为 0 到其上限之间。 因此,给定维度的长度为⼀个⼤于该维度的声明的上限。
2、长度限制:
每⼀维数组的长度限制为的最⼤值Integer数据类型,即Int32.MaxValue或 (2 ^31)-1。 但是,数组的总⼤⼩还受到系统上可⽤的内存限制。 如果尝试初始化数组超出可⽤内存量,则运⾏时会引发OutOfMemoryException。
3、⼤⼩和元素⼤⼩:
数组的⼤⼩独⽴于其元素的数据类型。 ⼤⼩始终表⽰元素 (不所占⽤的内存的字节数) 的总数。
4、内存消耗:
做出关于数组如何存储在内存中的假设是不可靠的。 由于不同数据宽度的平台上的存储会有所变化,因此同⼀数组在 64 位系统上可以占⽤⽐在 32 位系统上更多的内存。 具体取决于数组初始化时的系统配置,公共语⾔运⾏时 (CLR) 可以尽可能地将存储分配到靠近包元素的地⽅,或者将它们全部在⾃然硬件边界上对齐。 此外,数组需要存储开销的控制信息,⽽且每添加⼀个维度,这种开销随之增加。
5、维度限制:
除⼀维、⼆维数组外,还有三维、四维……,在 Visual Basic.NET中,数组的维度最多不超过32。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。