ZetCode

FreeBasic Preserve 关键字

最后修改日期:2025 年 6 月 16 日

FreeBasic 的 Preserve 关键字与 Redim 结合使用,可以在调整动态数组大小时保留其现有内容。如果没有 Preserve,调整数组大小会清除所有元素。

基本定义

在 FreeBasic 中,PreserveRedim 语句的一个修饰符。它确保在更改数组的维度时保留现有的数组元素。

Preserve 关键字只能在更改多维数组的最后一个维度时使用。在处理动态数组时,它对于维护数据完整性至关重要。

基本数组大小调整

此示例显示了使用 Preserve 和不使用 Preserve 调整数组大小的区别。

preserve_basic.bas
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 关键字对字符串数组的工作方式类似。

preserve_strings.bas
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

此示例展示了字符串数组在调整大小时如何保留其内容。原始元素保持不变,而新元素默认为空字符串。然后我们填充一些新的位置。

多维数组

对于多维数组,只能调整最后一个维度的大小。

preserve_multidim.bas
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 与用户定义类型

用户定义类型的数组在调整大小时也可以被保留。

preserve_udt.bas
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 具有一些值得注意的性能影响。

preserve_performance.bas
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 时处理潜在错误非常重要。

preserve_errors.bas
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 关键字,并通过实际示例展示了它在不同场景下的用法。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 FreeBasic 教程