Skip to content

Sub

声明构成Sub过程主体的名称、参数和代码。

语法:

[ attributes ]
[ Public | Private | Friend | Protected ] [ Static ] [ Overridable ] Sub name [ ( Of typevars ) ] [ ( arglist ) ] [ binding-clause ]
     [ statements ] ...
     [ Exit Sub ] ...
     [ statements ] ...
End Sub

attributes

可选 过程的一个或多个受支持属性

Public

可选 指示Sub过程可被所有模块中的所有其他过程访问。如果在包含Option Private的模块中使用,则该过程在项目外不可用。

Private

可选 指示Sub过程仅在其声明的模块中的其他过程可访问。

Friend

可选 仅在类模块中使用。指示Sub过程在整个项目中可见,但对对象实例的控制器不可见。

Protected

可选 (twinBASIC) 仅在类中使用。指示Sub过程可从声明类的内部和通过Inherits派生的类中访问,但外部调用者不能访问。

Static

可选 指示Sub过程的局部变量在调用之间保留。Static属性不影响在Sub外部声明的变量,即使它们在过程中被使用。

Overridable

可选 (twinBASIC) 将Sub标记为继承钩子,通过Inherits派生的类可以用Overrides子句替换。仅在参与Inherits层次结构的类成员上有意义。

name

Sub的名称;遵循标准变量命名约定。特殊名称New声明实例构造函数——参见继承了解链式构造*baseclass*.New(...)

Of typevars

可选 一个或多个类型变量名称,遵循标准变量命名约定。名称以逗号分隔。使过程成为泛型Sub

arglist

可选 表示调用Sub过程时传递参数的变量列表。多个变量以逗号分隔。语法见下面的arglist

binding-clause

可选 (twinBASIC) 三种尾随子句之一,将此主体绑定到在其他地方声明的成员:

  • Handles object.event [ , object.event … ]——将此Sub连接为命名事件的处理程序,取代传统的Object_Event命名约定。参见Handles语句
  • Implements iface.member [ , iface2.member2 … ]——为命名的Interface(或Class)成员提供主体,取代传统的Iface_Member命名约定。逗号分隔列表允许一个主体同时满足多个接口的成员。参见Implements语句
  • Overrides base.member——为通过Inherits继承的Overridable member提供主体。与同一标题上的Overridable组合可允许更深层派生类再次覆盖。
statements

可选Sub过程中执行的任何语句组。

Exit Sub

可选 立即从Sub过程返回。(裸Return语句不会退出Sub——它保留给GoSub...Return构造。)

arglist

语法:一个或多个
[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ () ] [ As type ] [ = defaultvalue ]

Optional
可选 指示参数不是必需的。如果使用,arglist中后续的所有参数也必须是可选的并使用Optional关键字声明。如果使用ParamArray,则不能用于任何参数。
ByVal
可选 指示参数按值传递。
ByRef
可选 指示参数按引用传递。与Visual Basic .NET不同,ByRef是默认的。
ParamArray
可选 仅用作arglist中的最后一个参数,指示最后一个参数是Variant元素的Optional数组。ParamArray关键字允许传递任意数量的参数。不能与ByValByRefOptional一起使用。
varname
表示参数的变量名称;遵循标准变量命名约定。
type
可选 传递给过程的参数的数据类型;可以是ByteBooleanIntegerLongCurrencySingleDoubleDecimalDateString(仅变长)、ObjectVariant、特定对象类型或泛型类型参数的名称。如果参数不是Optional,也可以指定用户自定义类型。
如果使用泛型类型参数的名称,它将绑定到传递给过程的参数的具体类型。名称绑定的作用域为过程主体。
defaultvalue
可选 任何常量或常量表达式。仅对Optional参数有效。如果类型为Object,则显式默认值只能为Nothing

如果未使用PublicPrivateFriend显式指定,Sub过程默认为公共的。

如果未使用Static,局部变量的值在调用之间不保留。

Friend关键字只能在类模块中使用。但是,Friend过程可被项目中任何模块的过程访问。Friend过程不出现在其父类的类型库中,也不能被后期绑定。

Sub过程可以是递归的;即它们可以调用自身来执行给定任务。但是,递归可能导致堆栈溢出。Static关键字通常不与递归Sub过程一起使用。

所有可执行代码必须在过程中。Sub过程不能在另一个**SubFunctionProperty**过程内部定义。

Exit Sub语句导致从Sub过程立即退出。程序执行继续到调用Sub过程的语句之后的语句。任何数量的Exit Sub语句可以出现在Sub过程中的任何位置。

Function过程类似,Sub过程是一个独立的过程,可以接受参数、执行一系列语句并更改其参数的值。但是,与返回值的Function过程不同,Sub过程不能用于表达式中。

Sub过程通过使用过程名称后跟参数列表来调用。有关如何调用Sub过程的具体信息,请参见**Call**语句。

Sub过程中使用的变量分为两类:在过程中显式声明的和未显式声明的。在过程中显式声明的变量(使用Dim或等效语句)始终是过程的局部变量。在过程中使用但未显式声明的变量也是局部变量,除非它们在过程外部的更高级别显式声明。

过程可以使用未在过程中显式声明的变量,但如果模块级定义的任何内容具有相同名称,则可能发生命名冲突。当过程引用与另一个过程、常量或变量同名的未声明变量时,假定过程引用的是该模块级名称。为避免此类冲突,请显式声明变量。使用**Option Explicit**语句强制显式声明变量。

INFO

GoSubGoToReturn不能进入或退出Sub过程。使用Exit Sub提前离开Sub

示例

本示例使用Sub语句定义构成Sub过程主体的名称、参数和代码。

vb
' Sub procedure definition.
' Sub procedure with two arguments.
Sub SubComputeArea(Length As Double, TheWidth As Double)
    Dim Area As Double ' Declare local variable.

    If Length = 0 Or TheWidth = 0 Then
        ' If either argument = 0.
        Exit Sub ' Exit Sub immediately.
    End If

    Area = Length * TheWidth ' Calculate area of rectangle.
    Debug.Print Area ' Print Area to Debug window.
End Sub

另请参阅

twinBASIC及其LOGO版权为作者"韦恩"所有