编程Visual Basic 开发者

如何在 Visual Basic 中实现模块(Module)的使用,以及在存储公共过程和变量方面,模块与类有什么区别?

用 Hintsage AI 助手通过面试

回答。

模块(Module)在 Visual Basic 中历史上用于存储在整个项目中可用的过程、函数和变量,无需显式创建实例。随着类的引入,它们的角色部分重叠,但仍然保留了显著的区别。

背景资料:

在经典的 Visual Basic(VB6)中,模块是分组公共函数和全局变量的唯一方法。在 VB.NET 中,模块仍然存在,但具有扩展的类功能。

问题:

开发者可能不理解模块与类之间的区别,这导致选择存储逻辑的方式错误、意外的代码重复或变量的意外行为。

解决方案:

选择模块与类取决于目标:

  • 模块旨在存储在整个应用程序中应可用的过程和变量,而无需创建实例
  • 类适合封装对象的状态和行为,并具有继承的能力

代码示例:

' 模块 Module MathUtils Public Function Add(x As Integer, y As Integer) As Integer Return x + y End Function End Module ' 使用 Dim result = MathUtils.Add(5, 10)

关键特点:

  • 模块的所有成员始终为 Shared,可在没有实例的情况下访问
  • 模块不支持继承或创建实例
  • 模块不能在类内声明为 Friend/Protected

误导性问题。

如果在模块中声明一个变量为 Public,它会对应用程序的所有窗体/类通用吗?

是的。Public 变量在模块中实质上是全局的。它们可以从项目的任何代码访问,虽然方便,但在多线程或意外覆盖值时可能导致错误。

可以使用 New 创建模块的实例吗?

不能。模块无法实例化。它们的所有功能都是静态可用的。

可以继承模块或声明具有 Protected 或 Private 访问修饰符的模块吗?

不可以。模块不能被继承,只能在命名空间(namespace)级别声明,不能嵌套,也不能具有 Public 或 Friend 以外的其他访问修饰符。

常见错误和反模式

  • 在没有访问控制的情况下使用全局变量
  • 在模块中存储用户状态而不是在类中(对于多线程无效)
  • 在不同模块中声明重复的函数

实际案例

负面案例

在项目中,所有用户状态变量都在模块中声明为 Public。任何窗口中值的更改都立即为所有其他窗口所共享。

优点:

  • 对变量的快速全局访问

缺点:

  • 覆盖和难以捕捉的 bug
  • 在多线程场景中不工作 — 竞态条件
  • 难以维护

正面案例

模块仅用于存储辅助工具(例如,转换函数),而用户状态存储在封装类中。

优点:

  • 清晰的代码组织
  • 没有访问冲突

缺点:

  • 初始设计工作需要更多精力