编程中级/高级 Visual Basic 开发人员

在Visual Basic中,Option Strict On和Off之间有什么区别,启用Strict可以防止哪些错误,以及如何编写符合严格模式的代码?

用 Hintsage AI 助手通过面试

答复。

问题背景
Option Strict是在Visual Basic .NET中引入的,旨在提高类型安全性。在早期版本的语言(VB6)中,发生隐式类型转换,这导致程序行为意外和错误难以捕捉。启用Strict使行为更加明确,且类型更为严格。

问题
隐式类型转换(例如,将字符串赋值给数字变量或从函数返回不同类型)会导致运行时错误。使用Option Strict Off的项目往往是难以发现的Bug的来源。

解决方案
在Option Strict On时,不允许隐式类型转换,所有变量声明、参数和返回值类型必须明确指定。这可以在编译阶段防止一大类错误,并促进代码的高质量。

代码示例:

Option Strict On Dim x As Integer x = "123" ' 编译错误 — 必须进行显式转换 x = CInt("123") ' OK Function GetNumber(ByVal input As String) As Integer Return input ' 编译错误 End Function

关键特点:

  • 要求显式类型转换。
  • 禁止隐式扩展转换。
  • 强制为每个变量和返回值声明类型。

具有干扰性的问题。

如果Strict On更方便和安全,那么Option Strict Off有什么用?

Option Strict Off用于支持已经包含大量隐式转换的旧代码(例如,从VB6迁移)。在新项目中,建议启用Strict以获得更可靠和安全的代码。

如果项目默认是Off,是否可以将严格类型选择恢复到文件级别?

可以,将Option Strict On指令添加到单个模块或文件的开头,严格类型检查将仅适用于该文件。

' 文件开头: Option Strict On

Strict会妨碍通过Object使用晚绑定吗?

是的,在Option Strict On时,无法调用在编译时无法识别的对象成员(晚绑定)。需要通过接口将对象转换为已知类型,或者仅在Off时使用动态操作。

常见错误和反模式

  • 仅因不愿意处理类型安全性而使用Option Strict Off。
  • 导致运行时异常的隐式类型转换。
  • 在未检查转换可能性的情况下进行大规模的类型转换,例如,通过CInt、CDbl等,没有TryParse。

现实示例

负面案例

程序员未启用Option Strict,在从文本框TextBox输入数据时,值直接分配给数字变量。当输入错误数据时,程序崩溃。

优点:

  • 快速启动。
  • 开发阶段代码较少。

缺点:

  • 在使用阶段出现大量错误。
  • 难以查找意外Bug的原因。

正面案例

程序员启用了Option Strict On,所有转换通过TryParse显式进行。编译阶段捕获错误,运行时异常最少。

优点:

  • 代码可靠性、可读性、可预测性。
  • 快速识别错误。

缺点:

  • 代码量略微增加。
  • 需要熟练处理类型转换的技能。