在 Visual Basic 中,过程内的变量在调用结束后通常会失去其值。关键词 Static 允许变量在过程调用之间保持其值。
问题历史:
在经典的 Visual Basic (VB6) 和 VB.NET 中,Static 经常用于在不使用类或模块字段的情况下创建计数器和标志。
问题:
开发人员可能会使用普通的局部变量,期望它们具有 "持久性",但实际上它们在每次调用时都会被重置。另一方面,为静态变量选择的位置(过程体或代码块)可能是错误的。
解决方案:
在过程内部使用 Static 声明变量。它在第一次调用过程时初始化一次,然后在调用之间保持其值。
代码示例:
Sub CountCalls() Static counter As Integer = 0 counter += 1 Console.WriteLine($"调用次数:{counter}") End Sub ' 调用将产生不同的值 CountCalls() ' 1 CountCalls() ' 2 CountCalls() ' 3
关键特点:
Static 变量仅在过程的作用域内存在,但在调用之间保持值过程中的 Static 与带 Shared 修饰符的类字段有什么区别?
Static 变量仅在该过程内作用 — 每个方法实例都有自己的独立静态变量。Shared 类字段在整个类中是唯一的。
可以在 For 或 If 块中声明 Static 变量吗?
不可以,Static 变量只能在过程的顶层声明,不允许在嵌套块(For,If)内声明。
从多个线程调用带 Static 的过程会发生什么?
在 VB.NET 版本中,Static 变量的作用域绑定到每个线程,这可能导致竞态条件和在多线程调用时的意外值。
在处理用户按键反应的过程里使用 Static 来存储触发时间,但没有考虑到多个用户同时按键的情况(例如,Web 应用程序或多线程窗口)。
优点:
缺点:
Static 用于存储实用方法的内部调用计数器,该方法仅从单个线程同步调用。
优点:
缺点: