Sub 语句 (Visual Basic)
声明定义 Sub 过程的名称、参数和代码。
[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]
[ statements ]
[ Exit Sub ]
[ statements ]
End Sub
部件
术语 |
定义 |
attributelist |
可选。请参见特性列表。 |
Partial |
可选。指示分部方法的定义。请参见 分部方法 (Visual Basic)。 |
accessmodifier |
可选。可以是如下内容之一: 请参见 Visual Basic 中的访问级别。 |
proceduremodifiers |
可选。可以是如下内容之一:
|
Shared |
可选。请参见 Shared。 |
Shadows |
可选。请参见 Shadows。 |
Async |
可选。异步参见。 |
name |
必需。过程名。请参见 已声明的元素名称 (Visual Basic)。若要为类创建构造函数过程,请将 Sub 过程的名称设为 New 关键字。有关更多信息,请参见对象生存期:如何创建和销毁对象 (Visual Basic)。 |
typeparamlist |
可选。泛型过程的类型参数的列表。请参见类型列表。 |
parameterlist |
可选。表示此过程的参数的局部变量名称的列表。请参见 参数列表 (Visual Basic)。 |
Implements |
可选。指示此过程实现一个或多个 Sub 过程,每个过程在一个由此过程的包含类或结构实现的接口中定义。请参见 Implements 语句。 |
implementslist |
如果提供了 Implements 则需要。所实现的 Sub 过程的列表。 implementedprocedure [ , implementedprocedure ... ] 每个 implementedprocedure 均有下列语法和部分: interface.definedname
组成部分描述
interface 必需。此过程的包含类或结构所实现的接口的名称。
definedname 必需。 interface 中定义该过程时使用的名称。
|
Handles |
可选。指示此过程是否可以处理一个或多个特定事件。请参见 Handles 子句 (Visual Basic)。 |
eventlist |
如果提供了 Handles 则需要。此过程处理的事件的列表。 eventspecifier [ , eventspecifier ... ] 每个 eventspecifier 均有下列语法和部分: eventvariable.event
组成部分描述
eventvariable 必需。用引发该事件的类或结构的数据类型声明的对象变量。
event 必需。此过程处理的事件的名称。
|
statements |
可选。要在此过程内运行的语句块。 |
EndSub |
终止此过程的定义。 |
备注
所有可执行代码都必须在过程内。不要将值返回给调用代码时,使用一个 Sub 程序。当您希望返回值时,使用一个 Function 程序。
定义 sub 过程
只能定义 Sub 程序在模块级别。sub 过程的声明上下文必须,因此,与选件类、结构、模块或接口,并且不能是源文件、命名空间、过程或块中。有关更多信息,请参见声明上下文和默认访问级别 (Visual Basic)。
Sub 过程默认为公共访问级别。使用访问修饰符,可以调整它们的访问级别。
如果过程使用 Implements 关键字,包含的选件类或结构必须具有紧跟在其 Class 或 Structure 语句的 Implements 语句。Implements 语句必须包含在 implementslist指定的每个接口。但是,接口定义 Sub 名称 (在 definedname) 不必与此过程的名称 (在 name)。
返回从 sub 过程
当 Sub 过程返回到调用代码时,执行继续该语句在调用它的语句之后。
下面的示例显示从 Sub 过程返回的结果。
Sub mySub(ByVal q As String)
Return
End Sub
使用 Exit Sub 和 Return 语句可以立即从 Sub 过程中退出。过程中的任何地方可以出现任意数量的 Exit Sub 和 Return 语句,而且可以混用 Exit Sub 和 Return 语句。
调用 sub 过程
您调用 Sub 程序通过在语句的过程名与其该名称后括号内然后参数列表。仅当未提供任何参数,则可以省略括号。但是,如果始终包含括号,则代码的可读性更高。
Sub 程序和 Function 程序可能具有参数和执行一系列语句。但是,Function 程序返回值,并且,Sub 程序不。因此,可以在表达式不能使用 Sub 程序。
可以使用 Call 关键字,当您调用 Sub 程序时,但是,该关键字不建议将大多数使用。有关更多信息,请参见Call 语句 (Visual Basic)。
Visual Basic 有时会重新排列算术表达式以提高内部效率。因此,因此,如果参数列表包括调用其他过程中的表达式,则不应该假定,这些表达式按特定的顺序将调用。
" sub 程序
使用异步功能,可以异步调用函数,而不使用显式回调或手动拆分您在多个函数或 lambda 表达式中的代码。
如果标记与 异步 修饰符的过程,就象程序中使用 等待 运算符。当控件移到在 Async 程序中的一个 Await 表达式,控件回调用方,因此,在过程的进度挂起,直到等待任务完成。当任务完成后,执行对该程序可以继续。
说明 |
---|
Async 程序返回给调用方,在为第一个等待不完整的遇到的对象或 Async 程序结束为止,后者首先进行。 |
还可以用 Async 修饰符的 Function 语句 (Visual Basic)。Async 函数可以有 Task<TResult> 或 Task的返回类型。一个示例本主题后面显示具有 Task<TResult>的一个返回类型的一个 Async 功能。
AsyncSub 程序的事件处理程序主要用途,值不能返回。AsyncSub 程序不能等待,并且,AsyncSub 程序的调用方无法捕获 Sub 程序引发的异常。
Async 程序不能声明任何 ByRef 参数。
有关 Async 程序的更多信息,请参见 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)、异步程序中的控制流(C# 和 Visual Basic)和 异步返回类型(C# 和 Visual Basic)。
示例
下面的示例使用 Sub 语句定义组成 Sub 过程体的名称、参数和代码。
Sub computeArea(ByVal length As Double, ByVal width As Double)
' Declare local variable.
Dim area As Double
If length = 0 Or width = 0 Then
' If either argument = 0 then exit Sub immediately.
Exit Sub
End If
' Calculate area of rectangle.
area = length * width
' Print area to Immediate window.
Debug.WriteLine(area)
End Sub
在具有 Task<TResult>的一个返回类型的下面的示例中,DelayAsync 是 AsyncFunction。DelayAsync 具有返回整数的一个 Return 语句。因此,DelayAsync 的函数声明必须具有 Task(Of Integer)的返回类型。由于返回类型为 Task(Of Integer),Await 表达式的计算 DoSomethingAsync 的生成一个整数,如以下语句示:Dim result As Integer = Await delayTask。
startButton_Click 程序是 Async Sub 程序的示例。由于 DoSomethingAsync 是 Async 功能,必须等待调用的任务,DoSomethingAsync,如以下语句示:Await DoSomethingAsync()。因为它有一个 Await 表达式,必须定义 startButton_ClickSub 程序与 Async 修饰符。
' Imports System.Diagnostics
' Imports System.Threading.Tasks
' This Click event is marked with the Async modifier.
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
Await DoSomethingAsync()
End Sub
Private Async Function DoSomethingAsync() As Task
Dim delayTask As Task(Of Integer) = DelayAsync()
Dim result As Integer = Await delayTask
' The previous two statements may be combined into
' the following statement.
' Dim result As Integer = Await DelayAsync()
Debug.WriteLine("Result: " & result)
End Function
Private Async Function DelayAsync() As Task(Of Integer)
Await Task.Delay(100)
Return 5
End Function
' Output:
' Result: 5