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:
proceduremodifiers
Optional. Dabei kann es sich um eine der folgenden Methoden handeln:
MustOverride Overrides
NotOverridable Overrides
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 dasNew
-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 implementierendenSub
-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 Async
Prozeduren 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