ZetCode

FreeBasic ByVal 关键字

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

FreeBasic 的 ByVal 关键字指定参数应通过值传递给函数或子例程。当按值传递时,函数会接收原始数据的副本。

基本定义

在 FreeBasic 中,ByVal 是默认的参数传递机制。这意味着被调用的函数会获得参数值的独立副本。

在函数内对 ByVal 参数所做的更改不会影响原始变量。这提供了安全性,但对于大型数据结构可能会带来性能开销。

简单的 ByVal 示例

这个基本示例演示了按值传递参数。

byval_simple.bas
Sub ModifyValue(ByVal x As Integer)
    x = x * 2
    Print "Inside function: "; x
End Sub

Dim num As Integer = 5
Print "Before function: "; num
ModifyValue(num)
Print "After function: "; num

函数调用后,原始的 num 保持不变。函数处理的是其值副本。这展示了 ByVal 如何保护原始变量免受修改。

带有字符串的 ByVal

在 FreeBasic 中,字符串也可以按值传递。

byval_string.bas
Sub ProcessString(ByVal s As String)
    s = "Modified: " & s
    Print "Inside function: "; s
End Sub

Dim text As String = "Original"
Print "Before function: "; text
ProcessString(text)
Print "After function: "; text

原始字符串保持不变。函数修改其局部副本。按值传递字符串是安全的,但可能涉及内存分配开销。

带有数组的 ByVal

数组通常按引用传递,但我们可以将 ByVal 与指针一起使用。

byval_array.bas
Sub ProcessArray(ByVal arr As Integer Ptr)
    ' Can access array elements but cannot change the pointer
    Print "First element: "; arr[0]
    arr[0] = 100 ' Modifies original array
End Sub

Dim numbers(2) As Integer = {1, 2, 3}
ProcessArray(@numbers(0))
Print "After function: "; numbers(0)

这里我们按值传递数组指针。函数可以修改数组内容,但不能更改指针指向的位置。通过指针修改了原始数组。

带有用户定义类型的 ByVal

用户定义类型可以按值传递,创建完整的副本。

byval_udt.bas
Type Point
    x As Integer
    y As Integer
End Type

Sub MovePoint(ByVal pt As Point)
    pt.x = pt.x + 10
    pt.y = pt.y + 10
    Print "Inside function: "; pt.x, pt.y
End Sub

Dim origin As Point
origin.x = 0
origin.y = 0
Print "Before function: "; origin.x, origin.y
MovePoint(origin)
Print "After function: "; origin.x, origin.y

原始的 Point 结构保持不变。函数处理的是结构的完整副本。对于大型结构,这可能会影响性能。

ByVal 与 ByRef 的比较

这个例子对比了 ByVal 和 ByRef 参数传递。

byval_vs_byref.bas
Sub ByValExample(ByVal x As Integer)
    x = x * 2
End Sub

Sub ByRefExample(ByRef x As Integer)
    x = x * 2
End Sub

Dim value As Integer = 5
ByValExample(value)
Print "After ByVal: "; value

value = 5 ' Reset value
ByRefExample(value)
Print "After ByRef: "; value

ByVal 版本不修改原始数据,而 ByRef 版本会修改。这清楚地展示了按值传递和按引用传递的区别。当你想保护原始变量时,请选择 ByVal。

带有函数返回值的 ByVal

函数可以返回其值,这些值随后可以按 ByVal 传递给其他函数。

byval_function.bas
Function GetNumber() As Integer
    Return 42
End Function

Sub PrintNumber(ByVal n As Integer)
    Print "The number is: "; n
End Sub

PrintNumber(GetNumber())

函数返回值按 ByVal 传递给 PrintNumber。这表明在函数调用中使用返回值时,它们会自动被视为 ByVal 参数。

带有指针的 ByVal

指针可以按值传递,创建指针本身的副本。

byval_pointer.bas
Sub ModifyPointer(ByVal ptr As Integer Ptr)
    Dim temp As Integer = 100
    ptr = @temp ' Only changes local copy
    Print "Inside function: "; *ptr
End Sub

Dim value As Integer = 5
Dim p As Integer Ptr = @value
Print "Before function: "; *p
ModifyPointer(p)
Print "After function: "; *p

原始指针保持不变。函数修改其本地指针副本。原始指向的值仍然可访问。

最佳实践

本教程介绍了 FreeBasic 的 ByVal 关键字,并通过实际示例展示了其在不同场景下的用法。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 FreeBasic 教程