VB.NET类中数组的正确实现及优化方案咨询
VB.NET类中数组的最优实现方法
原始代码的问题
- 数组未初始化:
myArray仅声明变量但未分配内存,直接访问会抛出NullReferenceException。 - 数组无
Count属性:VB.NET数组的长度属性是Length,Count属于集合类(如List)的属性。 - 循环内频繁
ReDim效率低下:每次ReDim都会重新分配内存,未加Preserve会丢失原有数据,即使加了Preserve也会复制现有元素,性能损耗大。
方案1:使用List(Of T)(最推荐)
List(Of T)是.NET专门为动态集合设计的类型,自带自动扩容逻辑,无需手动管理数组大小,API更丰富简洁,是处理动态元素集合的首选:
Public Class MyClass ' 直接初始化List,避免空引用 Public MyList As New List(Of String)() End Class
测试代码:
Dim m As New MyClass() For i = 0 To 9 ' 直接添加元素,List自动处理扩容 m.MyList.Add(i.ToString()) ' 若需通过索引赋值,可提前设置容量减少扩容次数(可选) ' m.MyList.Capacity = 10 ' m.MyList(i) = i.ToString() Next ' 获取元素数量用Count属性 Dim c As Integer = m.MyList.Count
如果实际存储的是子类类型,只需替换Of String为你的子类,比如List(Of YourSubClass),添加元素时直接m.MyList.Add(New YourSubClass())即可。
方案2:提前初始化固定长度数组
如果明确知道需要的元素数量,可在类初始化时直接指定数组长度,避免动态扩容:
Public Class MyClass Public MyArray() As String ' 通过构造函数传入数组长度初始化 Public Sub New(arraySize As Integer) ' 数组索引从0开始,size个元素对应索引0到size-1 ReDim MyArray(arraySize - 1) End Sub End Class
测试代码:
' 创建实例时指定数组长度为10(对应索引0-9) Dim m As New MyClass(10) For i = 0 To 9 m.MyArray(i) = i.ToString() Next ' 获取数组长度用Length属性 Dim c As Integer = m.MyArray.Length
方案3:封装数组的动态扩容逻辑
若必须使用数组,可在类内部封装扩容逻辑,简化外部调用:
Public Class MyClass Private _myArray() As String ' 对外提供只读的数组访问 Public ReadOnly Property MyArray() As String() Get Return _myArray End Get End Property Public Sub AddItem(item As String) If _myArray Is Nothing Then ' 初始化为长度1的数组 ReDim _myArray(0) _myArray(0) = item Else ' 扩容并保留原有元素 ReDim Preserve _myArray(_myArray.Length) _myArray(_myArray.Length - 1) = item End If End Sub End Class
测试代码:
Dim m As New MyClass() For i = 0 To 9 m.AddItem(i.ToString()) Next Dim c As Integer = m.MyArray.Length
总结
优先选择List(Of T),它内部已优化扩容策略(默认每次扩容为原容量的2倍),比手动ReDim高效得多,同时提供了添加、删除、查找等便捷方法,大幅简化代码逻辑。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

