Sub-Anweisung (Visual Basic)

Deklariert den Namen, die Parameter und den Code, die eine Sub-Prozedur definieren.

Syntax

[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]
    [ statements ]
    [ Exit Sub ]
    [ statements ]
End Sub

Bestandteile

  • attributelist

    Optional. Siehe Attributliste.

  • Partial

    Optional. Gibt die Definition einer partiellen Methode an. Siehe Partielle Methoden.

  • accessmodifier

    Optional. Dabei kann es sich um eine der folgenden Methoden handeln:

    Siehe Access levels in Visual Basic.

  • proceduremodifiers

    Optional. Dabei kann es sich um eine der folgenden Methoden handeln:

  • Shared

    Optional. Siehe Shared.

  • Shadows

    Optional. Siehe Shadows.

  • Async

    Optional. Siehe Async.

  • name

    Erforderlich. Name der Prozedur. Siehe Declared Element Names. Um eine Konstruktorprozedur für eine Klasse zu erstellen, legen Sie den Namen einer Sub-Prozedur auf das New-Schlüsselwort fest. Weitere Informationen finden Sie unter Objektlebensdauer: Erstellen und Zerstören von Objekten.

  • typeparamlist

    Optional. Liste der Typparameter für eine generische Prozedur. Siehe Typliste.

  • parameterlist

    Optional. Liste der lokalen Variablennamen, die für die Parameter dieser Prozedur stehen. Siehe Parameterliste.

  • Implements

    Optional. Gibt an, dass diese Prozedur mindestens eine Sub-Prozedur implementiert, die jeweils in einer Schnittstelle definiert ist, die durch die enthaltende Klasse oder Struktur dieser Prozedur implementiert wird. Siehe Implements-Anweisung.

  • implementslist

    Erforderlich, wenn Implements angegeben wird. Liste der zu implementierenden Sub-Prozeduren.

    implementedprocedure [ , implementedprocedure ... ]

    Jede implementedprocedure weist folgende Syntax und Bestandteile auf:

    interface.definedname

    Teil Beschreibung
    interface Erforderlich. Name einer Schnittstelle, die durch die enthaltende Klasse oder Struktur dieser Prozedur implementiert wird.
    definedname Erforderlich. Name, wodurch die Prozedur in interface definiert ist.
  • Handles

    Optional. Gibt an, dass diese Prozedur mindestens ein spezifisches Ereignis verarbeiten kann. Siehe Handles.

  • eventlist

    Erforderlich, wenn Handles angegeben wird. Liste der Ereignisse, die diese Prozedur behandelt.

    eventspecifier [ , eventspecifier ... ]

    Jede eventspecifier weist folgende Syntax und Bestandteile auf:

    eventvariable.event

    Teil Beschreibung
    eventvariable Erforderlich. Objektvariable, die mit dem Datentyp der Klasse oder Struktur deklariert wird, die das Ereignis auslöst.
    event Erforderlich. Der Name des Ereignisses, das diese Prozedur behandelt.
  • statements

    Optional. Block von Anweisungen, die innerhalb dieser Prozedur ausgeführt werden sollen.

  • End Sub

    Beendet die Definition dieser Prozedur.

Bemerkungen

Der gesamte ausführbare Code muss sich in einer Prozedur befinden. Verwenden Sie eine Sub Prozedur, wenn Sie keinen Wert an den aufrufenden Code zurückgeben möchten. Verwenden Sie eine Function Prozedur, wenn Sie einen Wert zurückgeben möchten.

Definieren einer Unterprozedur

Sie können eine Sub Prozedur nur auf Modulebene definieren. Der Deklarationskontext für eine Unterprozedur muss daher eine Klasse, eine Struktur, ein Modul oder eine Schnittstelle sein und kann keine Quelldatei, ein Namespace, eine Prozedur oder ein Block sein. Weitere Informationen finden Sie unter Deklarationskontexte und Standardzugriffsebenen.

Für Sub-Prozeduren gilt standardmäßig der öffentliche Zugriff. Sie können ihre Zugriffsebenen mit den Zugriffsmodifizierern anpassen.

Wenn die Prozedur das Implements Schlüsselwort verwendet, muss die enthaltende Klasse oder Struktur über eine Implements Anweisung verfügen, die unmittelbar auf das Class Schlüsselwort folgt Structure . Die Implements-Anweisung muss jede Schnittstelle enthalten, die in implementslist angegeben ist. Der Name, nach dem eine Schnittstelle die Sub (in definedname) definiert, muss jedoch nicht mit dem Namen dieser Prozedur (in name) übereinstimmen.

Zurückgeben von einer Unterprozedur

Wenn eine Sub Prozedur zum aufrufenden Code zurückkehrt, wird die Ausführung mit der Anweisung nach der Anweisung fortgesetzt, die sie aufgerufen hat.

Das folgende Beispiel zeigt eine Rückgabe aus einer Sub Prozedur.

Sub mySub(ByVal q As String)
    Return
End Sub

Die Exit Sub- und Return-Anweisungen führen zum sofortigen Verlassen einer Sub-Prozedur. Sie können beliebig viele Exit Sub- und Return-Anweisungen überall in der Prozedur verwenden und dabei auch Exit Sub- und Return-Anweisungen mischen.

Aufrufen einer Unterprozedur

Sie rufen eine Sub-Prozedur mithilfe des Prozedurnamens in einer Anweisung auf und folgen dann diesem Namen mit der Argumentliste in Klammern. Sie können die Klammern nur weglassen, wenn Sie keine Argumente angeben. Um einen gut leserlichen Code zu erhalten, sollten Sie die Klammern immer verwenden.

Eine Sub-Prozedur und eine Function-Prozedur können Parameter aufweisen und eine Reihe von Anweisungen ausführen. Eine Function-Prozedur gibt jedoch einen Wert zurück, und eine Sub-Prozedur funktioniert nicht. Daher können Sie keine Sub-Prozedur in einem Ausdruck verwenden.

Sie können das Call-Schlüsselwort verwenden, wenn Sie eine Sub-Prozedur aufrufen, aber dieses Schlüsselwort wird für die meisten Verwendungen nicht empfohlen. Weitere Informationen finden Sie unter Call-Anweisung.

Visual Basic ordnet arithmetische Ausdrücke manchmal neu an, um die interne Effizienz zu erhöhen. Wenn Ihre Argumentliste Ausdrücke enthält, die andere Prozeduren aufrufen, sollten Sie daher nicht davon ausgehen, dass diese Ausdrücke in einer bestimmten Reihenfolge aufgerufen werden.

Async-Unterprozeduren

Mithilfe der Async-Funktion können Sie asynchrone Methoden aufrufen, ohne explizite Rückrufe verwenden oder den Code manuell über mehrere Methoden oder Lambda-Ausdrücke teilen zu müssen.

Wenn Sie eine Methode mit dem Modifizierer Async kennzeichnen, können Sie den Operator Await in der Methode verwenden. Wenn die Kontrolle einen Await-Ausdruck in der Async-Prozedur erreicht, geht die Kontrolle an den Aufrufer zurück und der Fortschritt in der Prozedur wird angehalten, bis die erwartete Aufgabe abgeschlossen ist. Wenn die Aufgabe abgeschlossen ist, kann die Ausführung in der Methode fortgesetzt werden.

Hinweis

Eine Async-Prozedur kehrt zum Aufrufer zurück, wenn entweder das erste erwartete Objekt angetroffen wird, das noch nicht abgeschlossen ist, oder das Ende der Async-Prozedur erreicht wird, je nachdem, was zuerst eintritt.

Sie können auch eine Funktions-Anweisung mit dem Async Modifizierer markieren. Eine Async-Funktion kann den Rückgabetyp Task<TResult> oder Task haben. Ein Beispiel weiter unten in diesem Thema zeigt eine Async Funktion mit einem Rückgabetyp von Task<TResult>.

Async Sub-Prozeduren werden in erster Linie für Ereignishandler verwendet, bei denen kein Wert zurückgegeben werden kann. Eine Async Sub-Prozedur kann nicht erwartet werden, und der Aufrufer einer Async Sub-Prozedur kann keine Ausnahmen abfangen, die von der Sub-Prozedur ausgelöst werden.

Eine Async Prozedur kann keine ByRef-Parameter deklarieren.

Weitere Informationen zu AsyncProzeduren finden Sie unter Asynchrone Programmierung mit Async und Await, Kontrollfluss in Async-Programmen und Async-Rückgabetypen.

Beispiel 1

Im folgenden Beispiel wird die Sub Anweisung zum Definieren des Namens, der Parameter und des Codes verwendet, die den Textkörper einer Sub Prozedur bilden.

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

Beispiel 2

Im folgenden Beispiel ist DelayAsync eine asynchrone Funktion (Async Function) mit dem Rückgabetyp Task<TResult>. DelayAsync enthält eine Return -Anweisung, die eine ganze Zahl zurückgibt. Aus diesem Grund muss die Funktionsdeklaration von DelayAsync den Rückgabetyp Task(Of Integer) haben. Da der Rückgabetyp Task(Of Integer) ist, ergibt die Auswertung des Await-Ausdrucks in DoSomethingAsync eine ganze Zahl, wie die folgende Anweisung veranschaulicht: Dim result As Integer = Await delayTask

Die startButton_Click-Prozedur ist ein Beispiel einer Async Sub-Prozedur. Da DoSomethingAsync eine asynchrone Methode ist, muss die Aufgabe für den Aufruf von Async abgewartet werdenDoSomethingAsync, wie in der folgenden Anweisung dargestellt:Await DoSomethingAsync(). Die Sub-Prozedur startButton_Click muss zusammen mit dem Modifizierer Async definiert werden, da sie einen Await-Ausdruck aufweist.

' 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

Siehe auch