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
关键字。