ZetCode

FreeBasic Shared 关键字

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

FreeBasic 的 Shared 关键字允许变量在模块内的不同作用域之间进行访问。它弥合了全局变量和局部变量作用域之间的差距。

基本定义

在 FreeBasic 中,Shared 声明的变量在模块内可见,但在全局不可见。它们在函数调用之间保持其值,同时避免了全局命名空间污染。

Shared 变量在模块级别声明,但可以被该模块内的所有过程访问。与全局变量相比,它们提供了受控的访问。

简单的 Shared 变量

此示例演示了共享变量的基本用法。

shared_basic.bas
Dim Shared counter As Integer = 0

Sub IncrementCounter()
    counter += 1
    Print "Counter: "; counter
End Sub

IncrementCounter()
IncrementCounter()
IncrementCounter()

在这里,我们声明了一个共享计数器变量。IncrementCounter 子过程可以访问和修改它。该变量在调用之间保持其值,作用类似于模块级别的静态变量。

Shared 与全局变量的对比

此示例比较了共享变量和全局变量的行为。

shared_vs_global.bas
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 变量可以在模块内的多个过程中使用。

shared_multiple.bas
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 数组

数组也可以声明为共享,以便在整个模块中访问。

shared_array.bas
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 与静态变量

此示例结合了共享变量和静态变量。

shared_static.bas
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 变量即使在嵌套作用域中也保持可访问。

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

用户定义类型可以声明为共享,以便在整个模块中使用。

shared_udt.bas
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 对两个过程都可访问。一个过程设置值,另一个过程显示它们。这种模式在模块级别的配置或状态管理中很常见。

最佳实践

本教程通过各种场景下的实际示例,涵盖了 FreeBasic 的 Shared 关键字。

作者

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

列出所有 FreeBasic 教程