Function-Anweisung (Visual Basic)

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

Syntax

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

Bestandteile

  • attributelist

    Optional. Siehe Attributliste.

  • 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.

  • Iterator

    Optional. Weitere Informationen finden Sie unter Iterator.

  • name

    Erforderlich. Name der Prozedur. Siehe Declared Element Names.

  • 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.

  • returntype

    Erforderlich, wenn On für Option Strict festgelegt ist. Datentyp des Werts, der von dieser Prozedur zurückgegeben wird.

  • Implements

    Optional. Gibt an, dass diese Prozedur mindestens eine Function-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 Function-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 in dieser Prozedur ausgeführt werden sollen.

  • End Function

    Beendet die Definition dieser Prozedur.

Bemerkungen

Der gesamte ausführbare Code muss sich in einer Prozedur befinden. Jede Prozedur wird wiederum innerhalb einer Klasse, einer Struktur oder eines Moduls deklariert (die „enthaltende Klasse“, „enthaltende Struktur“ bzw. das „enthaltende Modul“).

Um einen Wert an den aufrufenden Code zurückzugeben, verwenden Sie eine Function-Prozedur. Andernfalls verwenden Sie eine Sub-Prozedur.

Definieren einer Funktion

Eine Function-Prozedur können Sie nur auf Modulebene definieren. Daher muss der Deklarationskontext einer Funktion eine Klasse, eine Struktur, ein Modul oder eine Schnittstelle sein. Eine Quelldatei, ein Namespace, eine Prozedur und ein Block sind als Kontext nicht möglich. Weitere Informationen finden Sie unter Deklarationskontexte und Standardzugriffsebenen.

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

Eine Function-Prozedur kann den Datentyp des Werts deklarieren, den die Prozedur zurückgibt. Sie können einen beliebigen Datentyp oder den Namen einer Aufzählung, einer Struktur, einer Klasse oder einer Schnittstellen festlegen. Wenn Sie den Parameter returntype nicht festlegen, gibt die Prozedur Object zurück.

Wenn diese Prozedur das Schlüsselwort Implements verwendet, muss die enthaltende Klasse oder Struktur ebenfalls eine Implements-Anweisung enthalten, die direkt auf ihre Class- oder Structure-Anweisung folgt. Die Implements-Anweisung muss jede Schnittstelle enthalten, die in implementslist angegeben ist. Der Name, mit dem eine Schnittstelle die Function (in definedname) definiert, muss nicht mit dem Namen dieser Prozedur (in name) übereinstimmen.

Hinweis

Mit Lambdaausdrücken können Sie Funktionsausdrücke auch inline definieren. Weitere Informationen finden Sie unter Funktionsausdruck und Lambdaausdrücke.

Verlassen einer Funktion

Wenn die Function-Prozedur die Steuerung an den aufrufenden Code zurückgibt, wird die Ausführung mit der Anweisung fortgesetzt, die auf die Anweisung folgt, welche die Prozedur aufgerufen hat.

Um einen Wert von einer Funktion zurückzugeben, können Sie entweder den Wert dem Funktionsnamen zuweisen oder ihn in eine Return-Anweisung einfügen.

Die Return-Anweisung weist gleichzeitig den Rückgabewert zu und verlässt die Funktion, wie das folgende Beispiel zeigt.

Function MyFunction(ByVal j As Integer) As Double
    Return 3.87 * j
End Function

Im folgenden Beispiel wird der Rückgabewert dem Funktionsnamen myFunction zugewiesen. Die Exit Function-Anweisung wird für das Verlassen der Funktion verwendet.

Function MyFunction(ByVal j As Integer) As Double
    MyFunction = 3.87 * j
    Exit Function
End Function

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

Wenn Sie Exit Function verwenden, ohne name einen Wert zuzuweisen, gibt die Prozedur den Standardwert für den Datentyp zurück, der in returntype angegeben ist. Wenn returntype nicht angegeben ist, gibt die Prozedur Nothing zurück, was der Standardwert für Object ist.

Aufrufen einer Funktion

Um eine Function-Prozedur aufzurufen, verwenden Sie den Prozedurnamen, gefolgt von der Argumentliste in Klammern, in einem Ausdruck. Die Klammern können Sie nur weglassen, wenn Sie keine Argumente angeben. Um einen gut leserlichen Code zu erhalten, sollten Sie die Klammern immer verwenden.

Eine Function-Prozedur rufen Sie genauso auf wie jede andere Bibliotheksfunktion, z. B. Sqrt, Cos und ChrW.

Sie können eine Funktion auch mit dem Schlüsselwort Call aufrufen. In diesem Fall wird der Rückgabewert ignoriert. Die Verwendung des Schlüsselworts Call wird in den meisten Fällen 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. Aus diesem Grund sollten Sie in einem arithmetischen Ausdruck keine Function-Prozedur verwenden, wenn die Funktion den Wert von Variablen im selben Ausdruck ändert.

Async-Funktionen

Mit Async können Sie asynchrone Funktionen aufrufen, ohne explizite Rückrufe zu verwenden oder Ihren Code manuell auf mehrere Funktionen oder Lambdaausdrücke aufzuteilen.

Wenn Sie eine Funktion mit dem Modifizierer Async kennzeichnen, können Sie den Operator Await in der Funktion verwenden. Wenn ein Await-Ausdruck in der Async-Funktion erreicht wird, wird die Steuerung an den Aufrufer zurückgegeben und die Ausführung der Funktion wird ausgesetzt, bis die erwartete Aufgabe abgeschlossen ist. Nach dem Abschluss der Aufgabe kann die Ausführung in der Funktion fortgesetzt werden.

Hinweis

Eine Async-Prozedur gibt die Steuerung an den Aufrufer zurück, wenn sie entweder das erste erwartete Objekt, das noch nicht abgeschlossen ist, oder das Ende der Async-Prozedur erreicht.

Eine Async-Funktion kann den Rückgabetyp Task<TResult> oder Task haben. Ein Beispiel einer Async-Funktion, die den Rückgabetyp Task<TResult> hat, sehen Sie unten.

Eine Async-Funktion kann keine ByRef-Parameter deklarieren.

Eine Sub-Anweisung kann ebenfalls mit dem Modifizierer Async gekennzeichnet werden. Dies wird in erster Linie bei Ereignishandlern gemacht, bei denen die Rückgabe eines Werts nicht möglich ist. Eine AsyncSub-Prozedur kann nicht erwartet werden, und der Aufrufer einer AsyncSub-Prozedur kann keine Ausnahmen erfassen, die von der Sub-Prozedur ausgegeben werden.

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

Iterator-Funktionen

Eine Iterator-Funktion führt eine benutzerdefinierte Iteration durch eine Auflistung durch, z. B. durch eine Liste oder ein Array. Eine Iterator-Funktion verwendet die Yield-Anweisung, um die einzelnen Elemente nacheinander zurückzugeben. Wenn eine Yield-Anweisung erreicht wird, wird die aktuelle Position im Code gespeichert. Wenn die Iteratorfunktion das nächste Mal aufgerufen wird, wird die Ausführung von dieser Position neu gestartet.

Sie können einen Iterator im Clientcode mit der Anweisung For Each...Next aufrufen.

Der Rückgabetyp einer Iterator-Funktion kann IEnumerable, IEnumerable<T>, IEnumerator oder IEnumerator<T> sein.

Weitere Informationen finden Sie unter Iteratoren.

Beispiel 1

Im folgenden Beispiel wird die Function-Anweisung verwendet, um den Namen, die Parameter und den Code zu deklarieren, die den Körper einer Function-Prozedur bilden. Der Modifizierer ParamArray ermöglicht es der Funktion, eine beliebige Anzahl von Argumenten zu akzeptieren.

Public Function CalcSum(ByVal ParamArray args() As Double) As Double
    CalcSum = 0
    If args.Length <= 0 Then Exit Function
    For i As Integer = 0 To UBound(args, 1)
        CalcSum += args(i)
    Next i
End Function

Beispiel 2

Im folgenden Beispiel wird die Funktion aufgerufen, die im vorherigen Beispiel deklariert wurde.

Module Module1

    Sub Main()
        ' In the following function call, CalcSum's local variables
        ' are assigned the following values: args(0) = 4, args(1) = 3,
        ' and so on. The displayed sum is 10.
        Dim returnedValue As Double = CalcSum(4, 3, 2, 1)
        Console.WriteLine("Sum: " & returnedValue)
        ' Parameter args accepts zero or more arguments. The sum
        ' displayed by the following statements is 0.
        returnedValue = CalcSum()
        Console.WriteLine("Sum: " & returnedValue)
    End Sub

    Public Function CalcSum(ByVal ParamArray args() As Double) As Double
        CalcSum = 0
        If args.Length <= 0 Then Exit Function
        For i As Integer = 0 To UBound(args, 1)
            CalcSum += args(i)
        Next i
    End Function

End Module

Beispiel 3

Im folgenden Beispiel ist DelayAsync eine AsyncFunction mit dem Rückgabetyp Task<TResult>. DelayAsync enthält eine Return -Anweisung, die eine ganze Zahl zurückgibt. Daher 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 Ganzzahl. Das wird in dieser Anweisung gezeigt: Dim result As Integer = Await delayTask.

Die startButton_Click-Prozedur ist ein Beispiel einer Async Sub-Prozedur. Da DoSomethingAsync eine Async-Funktion ist, muss die Aufgabe für den Aufruf von DoSomethingAsync abgewartet werden, wie in der folgenden Anweisung dargestellt: Await DoSomethingAsync(). Die startButton_ClickSub-Prozedur 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