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
選擇性。 表示部分方法的定義。 請參閱 Partial 方法。
accessmodifier
選擇性。 可以是下列其中一項:
proceduremodifiers
選擇性。 可以是下列其中一項:
MustOverride Overrides
NotOverridable 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
關鍵字,則包含類別或結構必須在其 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
程序。
當您呼叫 Sub
程序時,可以使用 Call
關鍵字,但不建議在大多數情況下使用該關鍵字。 如需詳細資訊,請參閱 Call 陳述式。
Visual Basic 有時會重新排列算術運算式,以提高內部效率。 因此,如果您的引數清單包含呼叫其他程式的運算式,則不應該假設這些運算式會以特定順序呼叫。
Async Sub 程序
使用 Async 功能,您就可以呼叫非同步函式,而不需要使用明確回呼或手動將您的程式碼分散到多種函式或 lambda 運算式上。
如果您使用 Async 修飾詞來標示程序,則可以在程序中使用 Await 運算子。 當控制權到達 Async
程序中的 Await
運算式時,控制權會傳回給呼叫者,並暫止程序中的進度,直到等候的工作完成。 當工作完成時,程序中的執行可以繼續。
注意
Async
程序會在遇到第一個未完成的等候物件或是到達 Async
程序的結尾時 (以先發生者為準),傳回呼叫者。
您也可以使用 Async
修飾詞標記 Function 陳述式。 Async
函式可能有 Task<TResult> 或 Task 傳回型別。 本主題稍後的內容提供範例,顯示具有 Task<TResult> 傳回型別的 Async
函式。
Async
Sub
程序通常用於事件處理常式,無法傳回值。 Async
Sub
程序無法等待,且 Async
Sub
程序的呼叫者無法擷取 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
是具有傳回型別 Task<TResult> 的 Async
Function
。 DelayAsync
具有傳回整數的 Return
陳述式。 因此,DelayAsync
的函式宣告必須有 Task(Of Integer)
的傳回型別。 因為傳回型別是 Task(Of Integer)
,所以 DoSomethingAsync
中 Await
運算式的評估會產生整數,如下列 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