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 |
選擇項。 要在此程序內執行的陳述式區塊。 |
End Sub |
結束這個程序的定義。 |
備註
所有可執行程式碼必須位在程序內。 當您不想要將值傳回給呼叫程式碼時,請使用 Sub 程序。 例如,當您想要傳回值時,請使用 Function 程序。
定義子程序
您可以只定義 Sub 程序在模組層級使用。 將子函數程序的宣告內容必須,因此,是類別、結構、模組或介面,且不能是原始程式檔、命名空間 (Namespace)、程序或區塊。 如需詳細資訊,請參閱宣告內容和預設存取層級 (Visual Basic)。
Sub 程序預設為公用存取。 您可以使用存取修飾詞,您可以調整其存取層級。
如果 Implements 程序使用關鍵字,則內含之類別或結構必須緊接在它的 Class 或 Structure 陳述式的 Implements 陳述式。 Implements 陳述式必須在 implementslist指定的每個介面。 然而,介面會定義 Sub 名稱 (在 definedname) 不一定要符合此程序的名稱 (在 name)。
傳回從子程序
當 Sub 程序回到呼叫程式碼時,程式碼會繼續執行陳述式在呼叫它的陳述式之後。
下列範例會顯示從 Sub 程序傳回。
Sub mySub(ByVal q As String)
Return
End Sub
Exit Sub 和 Return 陳述式會造成立即退出 Sub 程序。 任意數目的 Exit Sub 和 Return 陳述式可以出現在程序中的任何地方,並且 Exit Sub 和 Return 陳述式可以混合使用。
呼叫子程序
您呼叫 Sub 程序使用程序名稱在陳述式會在與括號中其引數清單的該名稱之後。 只有當您沒有提供任何引數,您可以省略括號。 然而,如果您一律使用括號括起來,則程式碼會較容易閱讀。
Sub 程序和 Function 程序可以有參數和執行一系列的陳述式。 不過, Function 程序傳回值並不 Sub 程序。 因此,您無法在運算式中使用 Sub 程序。
您可以使用 Call 關鍵字,當您呼叫程序時, Sub ,但是該關鍵字並不建議大部分使用。 如需詳細資訊,請參閱Call 陳述式 (Visual Basic)。
:Visual Basic 有時會重新排列算術運算式以提高內部效能。 因此,因此,如果您的引數清單包括呼叫其他程序的表示,您不應該假設,這些運算式會以特定順序來呼叫。
非同步子程序
您可以使用非同步功能,您可以叫用非同步函式,而不使用明確回呼或手動分割您的跨多個函式或 Lambda 運算式的程式碼。
如果您將標記為已與 非同步 修飾詞的程序,您在程序可以使用 等候 運算子。 當控制項到達 Async 程序時的一個 Await 表示,控制項傳回至呼叫端,因此,在程序中的進度暫止,直到等候的工作完成。 當工作完成時,則會從程序可復原。
注意事項 |
---|
Async 程序傳回給呼叫端,當先等候的物件不是完整的 Async 遇到或程序的結尾的任一為止,視何者先發生。 |
您也可以使用標記 Async 修飾詞的 Function 陳述式 (Visual Basic) 。 Async 函式可能有 Task<TResult> 或 Task的傳回型別。 一個例子本主題稍後會顯示具有 Task<TResult>之 Web 方法的傳回型別 Async 函式。
AsyncSub 程序為事件處理常式,主要使用值無法回復。 AsyncSub 程序無法等候,因此, AsyncSub 程序的呼叫端無法攔截程序 Sub 擲回的例外狀況。
Async 程序無法宣告任何 ByRef 參數。
如需 Async 程序的詳細資訊,請參閱 使用 Async 和 Await 設計非同步程式 (C# 和 Visual Basic)、 非同步程式中的控制流程 (C# 和 Visual Basic)和 非同步方法的傳回型別 (C# and 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