FreeBasic Preserve 关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 的 Preserve 关键字与 Redim 结合使用,可以在调整动态数组大小时保留其现有内容。如果没有 Preserve,调整数组大小会清除所有元素。
基本定义
在 FreeBasic 中,Preserve 是 Redim 语句的一个修饰符。它确保在更改数组的维度时保留现有的数组元素。
Preserve 关键字只能在更改多维数组的最后一个维度时使用。在处理动态数组时,它对于维护数据完整性至关重要。
基本数组大小调整
此示例显示了使用 Preserve 和不使用 Preserve 调整数组大小的区别。
Dim arr() As Integer = {1, 2, 3}
Redim arr(4) ' Resize without Preserve
Print "Without Preserve:"
For i As Integer = LBound(arr) To UBound(arr)
Print arr(i);
Next
Print
Dim arr2() As Integer = {1, 2, 3}
Redim Preserve arr2(4) ' Resize with Preserve
Print "With Preserve:"
For i As Integer = LBound(arr2) To UBound(arr2)
Print arr2(i);
Next
第一个数组在未 Preserve 的情况下调整大小时会丢失其值。第二个数组在调整大小后的数组中保留其原始值。对于数值类型,新元素将初始化为零。
保留字符串数组
Preserve 关键字对字符串数组的工作方式类似。
Dim names() As String = {"Alice", "Bob", "Charlie"}
Redim Preserve names(5)
names(3) = "David"
names(4) = "Eve"
For i As Integer = LBound(names) To UBound(names)
Print i; ": "; names(i)
Next
此示例展示了字符串数组在调整大小时如何保留其内容。原始元素保持不变,而新元素默认为空字符串。然后我们填充一些新的位置。
多维数组
对于多维数组,只能调整最后一个维度的大小。
Dim matrix(1 To 2, 1 To 2) As Integer
matrix(1, 1) = 1
matrix(1, 2) = 2
matrix(2, 1) = 3
matrix(2, 2) = 4
Redim Preserve matrix(1 To 2, 1 To 3) ' Only last dimension can change
' Fill new elements
matrix(1, 3) = 5
matrix(2, 3) = 6
For i As Integer = 1 To 2
For j As Integer = 1 To 3
Print matrix(i, j); " ";
Next
Print
Next
这演示了在保留内容的同时调整二维数组的大小。请注意,我们只能更改最后一个维度(在本例中是列)。尝试更改第一个维度会导致错误。
Preserve 与用户定义类型
用户定义类型的数组在调整大小时也可以被保留。
Type Person
name As String
age As Integer
End Type
Dim people() As Person
Redim people(2)
people(0).name = "Alice" : people(0).age = 25
people(1).name = "Bob" : people(1).age = 30
Redim Preserve people(4)
people(2).name = "Charlie" : people(2).age = 35
For i As Integer = LBound(people) To UBound(people)
If Len(people(i).name) > 0 Then
Print people(i).name; " ("; people(i).age; ")"
Else
Print "[Empty]"
End If
Next
此示例显示了保留自定义类型数组。调整大小后,现有的 Person 记录保持不变。新元素使用默认值初始化(name 为空字符串,age 为 0)。
性能注意事项
使用 Preserve 具有一些值得注意的性能影响。
Dim bigArray(1000000) As Integer ' 1 million elements
' Fill array with values
For i As Integer = LBound(bigArray) To UBound(bigArray)
bigArray(i) = i
Next
' Time resizing with Preserve
Dim t As Double = Timer
Redim Preserve bigArray(2000000)
Print "Time to resize with Preserve: "; Timer - t; " seconds"
' Compare to creating new array
Dim t2 As Double = Timer
Dim newArray(2000000) As Integer
For i As Integer = 0 To 1000000
newArray(i) = i
Next
Print "Time to create new array: "; Timer - t2; " seconds"
此基准测试将使用 Preserve 调整大小与创建新数组进行了比较。对于大型数组,Preserve 可能会变慢,因为它必须复制所有现有元素。对于频繁调整大小,请考虑替代数据结构。
Preserve 的错误处理
在使用 Preserve 时处理潜在错误非常重要。
Dim arr() As Integer = {1, 2, 3}
' Attempt invalid resize (smaller array)
On Error Goto error_handler
Redim Preserve arr(1)
Print "Resize successful"
Exit Sub
error_handler:
Print "Error "; Err; ": "; Error(Err)
Resume Next
此示例显示了调整大小时的错误处理。尝试使用 Preserve 使数组变小会导致错误。在调整数组大小时始终检查数组边界并实现适当的错误处理。
最佳实践
- 最小化重调大小:避免频繁的小重调大小;预估所需大小。
- 检查边界:始终验证新维度是否有效。
- 错误处理:为重调大小操作实现错误处理。
- 多维:请记住只能更改最后一个维度。
- 替代方案:考虑链表用于频繁更改的数据。
本教程涵盖了 FreeBasic 的 Preserve 关键字,并通过实际示例展示了它在不同场景下的用法。