宣告會定義 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選擇性。 表示部分方法的定義。 請參閱 Partial 方法。
accessmodifier選擇性。 可以是下列其中一項:
proceduremodifiers選擇性。 可以是下列其中一項:
MustOverride OverridesNotOverridable Overrides
Shared選擇性。 請參閱 Shared。
Shadows選擇性。 請參閱 Shadows。
Async選擇性。 請參閱 Async。
name必要。 程序的名稱。 請參閱 Declared Element Names。 如要建立類別的建構函式程序,請將
Sub程序的名稱設定為New關鍵字。 如需詳細資訊,請參閱物件存留期:物件的建立和終結。typeparamlist選擇性。 類型參數的清單,適用於泛型程序。 請參閱類型清單。
parameterlist選擇性。 表示此程序參數的區域變數名稱清單。 請參閱參數清單。
Implements選擇性。 表示此程序會實作一或多個
Sub程序,每個程序都會在此程序包含類別或結構所實作的介面中定義。 請參閱 Implements 陳述式。implementslist如果使用
Implements,則為必要項。 實作之Sub程序的清單。implementedprocedure [ , implementedprocedure ... ]每個
implementedprocedure都具有下列語法和組件:interface.definedname部分 描述 interface必要。 此程序包含類別或結構所實作的介面名稱。 definedname必要。 名稱,據以在 interface中定義程序。Handles選擇性。 表示此程序可以處理一或多個特定事件。 請參閱 Handles。
eventlist如果使用
Handles,則為必要項。 此程序處理的事件清單。eventspecifier [ , eventspecifier ... ]每個
eventspecifier都具有下列語法和組件:eventvariable.event部分 描述 eventvariable必要。 以引發事件之類別或結構之資料類型宣告的物件變數。 event必要。 此程序處理的事件名稱。 statements選擇性。 要在程序中執行的陳述式區塊。
End Sub終止此程序的定義。
備註
所有可執行檔程式碼都必須位於某些程序中。 當您不想將值傳回呼叫程式碼時,請使用 Sub 程序。 當您想傳回值時,請使用 Function 程序。
定義 Sub 程序
您只能在模組層級定義 Sub 程序。 因此,Sub 程序的宣告內容必須是類別、結構、模組或介面,不能是來源檔案、命名空間、程序或區塊。 如需詳細資訊,請參閱宣告內容和預設存取層級。
Sub 程序預設為公用存取。 您可以使用存取修飾詞來調整其存取層級。
如果此程序使用 Implements 關鍵字,則包含類別或結構必須在其 Implements 或 Class 陳述式後面緊接著 Structure 陳述式。
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 有時會重新排列算術運算式,以提高內部效率。 因此,如果您的引數清單包含呼叫其他程式的運算式,則不應該假設這些運算式會以特定順序呼叫。
Async Sub 程序
使用 Async 功能,您就可以呼叫非同步函式,而不需要使用明確回呼或手動將您的程式碼分散到多種函式或 lambda 運算式上。
如果您使用 Async 修飾詞來標示程序,則可以在程序中使用 Await 運算子。 當控制權到達 Await 程序中的 Async 運算式時,控制權會傳回給呼叫者,並暫止程序中的進度,直到等候的工作完成。 當工作完成時,程序中的執行可以繼續。
注意
Async 程序會在遇到第一個未完成的等候物件或是到達 Async 程序的結尾時 (以先發生者為準),傳回呼叫者。
您也可以使用 修飾詞標記 Async。
Async 函式可能有 Task<TResult> 或 Task 傳回型別。 本主題稍後的內容提供範例,顯示具有 Async 傳回型別的 Task<TResult> 函式。
Async
Sub 程序通常用於事件處理常式,無法傳回值。
Async
Sub 程序無法等待,且 AsyncSub 程序的呼叫者無法擷取 Sub 程序擲回的例外狀況。
Async 程序無法宣告任何 ByRef 參數。
如需 Async 程序的詳細資訊,請參閱使用 Async 和 Await 進行非同步程式設計 (C#)、非同步程式中的控制流程 (C#) 和 Async 傳回型別 (C#)。
範例 1
下列範例使用 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
範例 2
在下列範例中,DelayAsync 是具有傳回型別 Async 的 FunctionTask<TResult>。
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()。
startButton_Click
Sub 程序必須以 Async 修飾詞定義,因為其有 Await 運算式。
' 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