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

    選擇性。 可以是下列其中一項:

    請參閱 Access levels in Visual Basic

  • proceduremodifiers

    選擇性。 可以是下列其中一項:

  • 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 關鍵字,則包含類別或結構必須在其 ClassStructure 陳述式後面緊接著 Implements 陳述式。 Implements 陳述式必須包含 implementslist 中指定的每個介面。 不過,介面定義 Sub 的名稱 (在 definedname 中) 不需要符合此程序的名稱 (在 name 中)。

從 Sub 程序傳回

Sub 程序傳回呼叫程式碼時,會繼續執行接在呼叫陳述式後面的陳述式。

下列範例顯示從 Sub 程序傳回。

Sub mySub(ByVal q As String)
    Return
End Sub

Exit SubReturn 陳述式會導致 Sub 程序立即結束。 任意數目的 Exit SubReturn 陳述式可以出現在程序中的任何位置,且您可以混合 Exit SubReturn 陳述式。

呼叫 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 函式。

AsyncSub 程序通常用於事件處理常式,無法傳回值。 AsyncSub 程序無法等待,且 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 是有 Task<TResult> 傳回型別的 AsyncFunctionDelayAsync 具有傳回整數的 Return 陳述式。 因此,DelayAsync 的函式宣告必須有 Task(Of Integer) 的傳回型別。 因為傳回型別是 Task(Of Integer),所以 DoSomethingAsyncAwait 運算式的評估會產生整數,如下列 Dim result As Integer = Await delayTask 陳述式所示。

startButton_Click 程序是 Async Sub 程序的範例。 因為 DoSomethingAsyncAsync 函式,對 DoSomethingAsync 的呼叫工作必須等候,如下列陳述式所示:Await DoSomethingAsync()startButton_ClickSub 程序必須以 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

另請參閱