在 Visual Basic 中,模块(Module)允许声明在整个项目中可用的变量和过程(使用正确的访问修饰符)。在模块内声明的变量在过程之外成为其字段——它们的可见性取决于修饰符(Private/Friend/Public),生命周期持续到应用程序运行结束。
模块变量的关键特点:
与全局变量(例如,在其他语言或旧版 VB6 中)不同,模块变量在未明确声明为 Public 的情况下在外部程序集不可访问。
示例:
Module Globals Public Counter As Integer Sub Increment() Counter += 1 End Sub End Module ' 从同一项目的任何位置访问 Counter
问题: 当模块变量用 Private 修饰符声明时,是什么访问权限?它可以在同一项目的其他模块中访问吗?
答案: 不可以,使用 Private 修饰符的变量仅在该模块内部可用——无法从其他模块或类访问它。
Module Data Private x As Integer End Module ' Module Other 将无法看到 x
故事
在开发计算服务时,所有中间结果都保存在模块变量中。一位开发者以为在调用之间数据会“重置”,但状态得以保持(Application Scope)。这导致多个用户并行使用服务时出现错误。解决方案:使用局部变量,并在需要线程安全性时避免在模块中保存状态。
故事
在一个多文件项目中,模块变量用
Friend修饰符进行声明(而不是Public)。期望它在解决方案的所有相关项目中可用,但它仅在一个程序集内部可见,从而在集成阶段引发了意外访问错误。
故事
优化代码后,过程的逻辑标志停止工作,因为类构造函数未传递定义静态日志标志的模块。最后,使用了旧版本的值,导致系统处理过时的数据,且由于追踪模块变量状态更改的复杂性,Bug 长时间得不到解决。