Visual Basic 中的生命周期

声明元素的 生存期 是可供使用的时间段。 变量是唯一具有生存期的元素。 为此,编译器将过程参数和函数作为变量的特殊情况返回。 变量的生存期表示它可以保存值的时间段。 其值可以在生存期内更改,但始终保留一些值。

不同的生存期

成员变量(在模块级别(在任何过程之外声明)通常与声明它的元素具有相同的生存期。 在类或结构中声明的非共享变量作为声明它的类或结构的每个实例的单独副本存在。 每个此类变量与实例的生存期相同。 但是,变量 Shared 只有一个生存期,该生存期持续到应用程序运行的全部时间。

局部变量(在过程内声明)仅在声明它的过程正在运行时存在。 这也适用于该过程的参数或任何函数的返回值。 但是,如果该过程调用其他过程,则局部变量会在调用的过程运行时保留其值。

生存期的开始

当控件进入声明它的过程时,局部变量的生存期开始。 一旦过程开始运行,每个局部变量都会初始化为其数据类型的默认值。 当过程遇到指定 Dim 初始值的语句时,它将这些变量设置为这些值,即使代码已经向其分配了其他值。

结构变量的每个成员都会初始化,就像它是一个单独的变量一样。 同样,数组变量的每个元素都单独初始化。

在过程(如 For 循环)内的块中声明的变量在进入过程时初始化。 无论代码是否实际执行这些代码块,这些初始化都会生效。

生存期结束

当过程终止时,不会保留其局部变量的值,Visual Basic 会回收其内存。 下次调用该过程时,会重新创建其所有局部变量并重新初始化。

当类或结构的实例终止时,其非共享变量会丢失其内存及其值。 类或结构的每个新实例都会创建并重新初始化其非共享变量。 但是,变量将会被保留,直到您的应用程序停止运行。

延长生存期

如果使用关键字声明局部变量 Static ,则其生存期长于其过程的执行时间。 下表显示了过程声明如何确定变量存在的时间 Static

过程位置和共享 静态变量生存期开始 静态变量生存期结束
在模块中(默认共享) 第一次调用该过程时 应用程序停止运行时
在类中,Shared(过程不是实例成员) 首次在特定实例或类或结构名称本身上调用该过程 应用程序停止运行时
在类的实例中,而不是Shared(过程是实例成员) 首次在特定实例上调用该过程 释放实例以进行垃圾回收 (GC) 时

同名的静态变量

可以在多个过程中声明具有相同名称的静态变量。 如果执行此作,Visual Basic 编译器会将每个此类变量视为单独的元素。 其中一个变量的初始化不会影响其他变量的值。 如果使用一组重载定义过程,并在每个重载中声明具有相同名称的静态变量,则同样适用。

包含静态变量的元素

可以在类中声明静态局部变量,即在该类中的过程内。 但是,不能将结构中的静态局部变量声明为结构成员,也不能声明为该结构中过程的局部变量。

示例:

DESCRIPTION

以下示例使用 Static 关键字声明变量。 请注意,当 Dim使用修饰符时(例如 ),不需要 Static 关键字。

代码

Function runningTotal(ByVal num As Integer) As Integer
    Static applesSold As Integer
    applesSold = applesSold + num
    Return applesSold
End Function

注释

在前面的示例中,该过程applesSold返回到调用代码后,该变量runningTotal将继续存在。 runningTotal下次调用时,applesSold保留其以前计算的值。

如果在没有使用 applesSold 的情况下声明 Static,则以前的累积值不会在跨调用 runningTotal 时被保留。 下次runningTotal被调用时,applesSold会被重新创建并初始化为 0,而runningTotal只会返回它被调用时的相同值。

编译代码

可以将静态局部变量的值初始化为其声明的一部分。 如果声明数组, Static则可以初始化其排名(维度数)、每个维度的长度以及各个元素的值。

安全

在前面的示例中,可以通过在模块级别声明 applesSold 来生成相同的生存期。 但是,如果以这种方式更改了变量的范围,则过程将不再具有独占访问权限。 由于其他过程可以访问 applesSold 和更改其值,因此运行总数可能不可靠,并且代码可能更难以维护。

另请参阅