FreeBasic Shared 关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 的 Shared 关键字允许变量在模块内的不同作用域之间进行访问。它弥合了全局变量和局部变量作用域之间的差距。
基本定义
在 FreeBasic 中,Shared 声明的变量在模块内可见,但在全局不可见。它们在函数调用之间保持其值,同时避免了全局命名空间污染。
Shared 变量在模块级别声明,但可以被该模块内的所有过程访问。与全局变量相比,它们提供了受控的访问。
简单的 Shared 变量
此示例演示了共享变量的基本用法。
Dim Shared counter As Integer = 0
Sub IncrementCounter()
counter += 1
Print "Counter: "; counter
End Sub
IncrementCounter()
IncrementCounter()
IncrementCounter()
在这里,我们声明了一个共享计数器变量。IncrementCounter 子过程可以访问和修改它。该变量在调用之间保持其值,作用类似于模块级别的静态变量。
Shared 与全局变量的对比
此示例比较了共享变量和全局变量的行为。
Dim Shared moduleVar As String = "Module"
Dim globalVar As String = "Global"
Sub ShowVars()
Print "Module var: "; moduleVar
Print "Global var: "; globalVar
End Sub
ShowVars()
两个变量都可以在子过程中访问,但 moduleVar 仅限于模块。全局变量可以被程序中的任何代码访问,而共享变量则保持模块私有。
在多个过程中使用 Shared
Shared 变量可以在模块内的多个过程中使用。
Dim Shared userStatus As String
Sub SetStatus(newStatus As String)
userStatus = newStatus
End Sub
Sub PrintStatus()
Print "Current status: "; userStatus
End Sub
SetStatus("Active")
PrintStatus()
SetStatus("Inactive")
PrintStatus()
userStatus 变量在两个过程中共享。SetStatus 修改它,而 PrintStatus 读取它。这演示了模块内共享状态的管理。
Shared 数组
数组也可以声明为共享,以便在整个模块中访问。
Dim Shared values(1 To 5) As Integer
Sub FillArray()
For i As Integer = 1 To 5
values(i) = i * 10
Next
End Sub
Sub PrintArray()
For i As Integer = 1 To 5
Print values(i); " ";
Next
Print
End Sub
FillArray()
PrintArray()
共享数组 values 对两个过程都可访问。FillArray 填充它,PrintArray 显示内容。共享数组对于模块级别的数据存储很有用。
Shared 与静态变量
此示例结合了共享变量和静态变量。
Dim Shared total As Integer = 0
Function AddToTotal(value As Integer) As Integer
Static calls As Integer = 0
calls += 1
total += value
Print "Call "; calls; ": Added "; value; ", Total: "; total
Return total
End Function
AddToTotal(10)
AddToTotal(20)
AddToTotal(30)
共享变量 total 在函数调用之间累积值,而静态变量 calls 在本地跟踪调用次数。这表明共享变量和静态变量如何协同工作。
嵌套作用域中的 Shared
Shared 变量即使在嵌套作用域中也保持可访问。
Dim Shared outerVar As String = "Outer"
Sub OuterSub()
Print "Outer: "; outerVar
Sub InnerSub()
Print "Inner: "; outerVar
outerVar = "Modified"
End Sub
InnerSub()
Print "Outer after inner: "; outerVar
End Sub
OuterSub()
共享变量 outerVar 在外部和内部子过程中都可访问。在内部作用域中所做的更改会保留在外部作用域中,这表明了跨嵌套作用域的共享变量可见性。
Shared 与用户定义类型
用户定义类型可以声明为共享,以便在整个模块中使用。
Type Person
name As String
age As Integer
End Type
Dim Shared user As Person
Sub SetPerson(n As String, a As Integer)
user.name = n
user.age = a
End Sub
Sub PrintPerson()
Print "Name: "; user.name; ", Age: "; user.age
End Sub
SetPerson("Alice", 30)
PrintPerson()
共享变量 Person user 对两个过程都可访问。一个过程设置值,另一个过程显示它们。这种模式在模块级别的配置或状态管理中很常见。
最佳实践
- 作用域: 对于不需要全局可见性的模块级变量,请使用 shared。
- 初始化: 始终显式初始化共享变量。
- 命名: 为共享变量添加前缀以区分它们与局部变量。
- 线程安全: 在多线程代码中处理共享变量时要小心。
- 封装: 优先使用过程而不是直接访问共享变量。
本教程通过各种场景下的实际示例,涵盖了 FreeBasic 的 Shared 关键字。