Share via


Functie-instructie (Visual Basic)

Declareert de naam, parameters en code waarmee een Function procedure wordt gedefinieerd.

Syntaxis

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

generator

  • attributelist

    Optioneel. Zie de lijst met kenmerken.

  • accessmodifier

    Optioneel. Dit kan een van de volgende zijn:

    Zie Access-niveaus in Visual Basic.

  • proceduremodifiers

    Optioneel. Dit kan een van de volgende zijn:

  • Shared

    Optioneel. Zie Gedeeld.

  • Shadows

    Optioneel. Zie schaduwen.

  • Async

    Optioneel. Zie Async.

  • Iterator

    Optioneel. Zie Iterator.

  • name

    Vereist. Naam van de procedure. Zie Gedeclareerde elementnamen.

  • typeparamlist

    Optioneel. Lijst met typeparameters voor een algemene procedure. Zie Lijst met typen.

  • parameterlist

    Optioneel. Lijst met namen van lokale variabelen die de parameters van deze procedure vertegenwoordigen. Zie de lijst met parameters.

  • returntype

    Vereist als Option Strict dat het is On. Gegevenstype van de waarde die door deze procedure wordt geretourneerd.

  • Implements

    Optioneel. Geeft aan dat deze procedure een of meer Function procedures implementeert, die elk zijn gedefinieerd in een interface die wordt geïmplementeerd door de klasse of structuur van deze procedure. Zie Implementatie-instructie.

  • implementslist

    Vereist indien Implements opgegeven. Lijst met Function procedures die worden geïmplementeerd.

    implementedprocedure [ , implementedprocedure ... ]

    Elk implementedprocedure heeft de volgende syntaxis en onderdelen:

    interface.definedname

    Onderdeel Beschrijving
    interface Vereist. De naam van een interface die door deze procedure wordt geïmplementeerd, bevat klasse of structuur.
    definedname Vereist. Naam waarmee de procedure is gedefinieerd in interface.
  • Handles

    Optioneel. Geeft aan dat deze procedure een of meer specifieke gebeurtenissen kan verwerken. Zie Ingangen.

  • eventlist

    Vereist indien Handles opgegeven. Lijst met gebeurtenissen die door deze procedure worden verwerkt.

    eventspecifier [ , eventspecifier ... ]

    Elk eventspecifier heeft de volgende syntaxis en onderdelen:

    eventvariable.event

    Onderdeel Beschrijving
    eventvariable Vereist. Objectvariabele gedeclareerd met het gegevenstype van de klasse of structuur die de gebeurtenis genereert.
    event Vereist. De naam van de gebeurtenis die door deze procedure wordt verwerkt.
  • statements

    Optioneel. Blok van instructies dat binnen deze procedure moet worden uitgevoerd.

  • End Function

    Hiermee wordt de definitie van deze procedure beëindigd.

Opmerkingen

Alle uitvoerbare code moet zich in een procedure bevindt. Elke procedure wordt op zijn beurt gedeclareerd binnen een klasse, een structuur of een module die de klasse, structuur of module wordt genoemd.

Als u een waarde wilt retourneren aan de aanroepende code, gebruikt u een Function procedure. Gebruik anders een Sub procedure.

Een functie definiëren

U kunt een Function procedure alleen definiëren op moduleniveau. De declaratiecontext voor een functie moet daarom een klasse, een structuur, een module of een interface zijn en kan geen bronbestand, een naamruimte, een procedure of een blok zijn. Zie Declaratiecontexten en standaardtoegangsniveaus voor meer informatie.

Function procedures zijn standaard ingesteld op openbare toegang. U kunt hun toegangsniveaus aanpassen met de toegangsaanpassingen.

Een Function procedure kan het gegevenstype declareren van de waarde die door de procedure wordt geretourneerd. U kunt elk gegevenstype of de naam van een opsomming, een structuur, een klasse of een interface opgeven. Als u de returntype parameter niet opgeeft, wordt de procedure geretourneerd Object.

Als in deze procedure het Implements trefwoord wordt gebruikt, moet de betreffende klasse of structuur ook een Implements instructie hebben die direct volgt op Class de bijbehorende of Structure instructie. De Implements instructie moet elke interface bevatten die is opgegeven in implementslist. De naam waarmee een interface de Function (in definedname) definieert, hoeft echter niet overeen te komen met de naam van deze procedure (in name).

Notitie

U kunt lambda-expressies gebruiken om functie-expressies inline te definiëren. Zie Functie-expressies en Lambda-expressies voor meer informatie.

Terugkeren vanuit een functie

Wanneer de Function procedure terugkeert naar de aanroepende code, gaat de uitvoering verder met de instructie die volgt op de instructie die de procedure wordt genoemd.

Als u een waarde van een functie wilt retourneren, kunt u de waarde toewijzen aan de naam van de functie of deze opnemen in een Return instructie.

De Return instructie wijst tegelijkertijd de retourwaarde toe en sluit de functie af, zoals in het volgende voorbeeld wordt weergegeven.

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

In het volgende voorbeeld wordt de retourwaarde toegewezen aan de functienaam myFunction en wordt vervolgens de Exit Function instructie gebruikt om te retourneren.

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

De Exit Function en Return instructies veroorzaken een onmiddellijke uitgang van een Function procedure. Elk aantal Exit Function instructies Return en instructies kan overal in de procedure worden weergegeven en u kunt deze combineren Exit Function en Return instructies.

Als u Exit Function zonder een waarde toe te namewijzen, retourneert de procedure de standaardwaarde voor het gegevenstype dat is opgegeven in returntype. Als returntype dit niet is opgegeven, retourneert Nothingde procedure , de standaardwaarde voor Object.

Een functie aanroepen

U roept een Function procedure aan met behulp van de procedurenaam, gevolgd door de lijst met argumenten tussen haakjes, in een expressie. U kunt de haakjes alleen weglaten als u geen argumenten opgeeft. Uw code is echter beter leesbaar als u altijd de haakjes opneemt.

U roept een Function procedure op dezelfde manier aan als u een bibliotheekfunctie aanroept, zoals Sqrt, Cosof ChrW.

U kunt ook een functie aanroepen met behulp van het Call trefwoord. In dat geval wordt de retourwaarde genegeerd. Het gebruik van het trefwoord wordt in de Call meeste gevallen niet aanbevolen. Zie Oproepinstructie voor meer informatie.

Visual Basic rangschikt soms rekenkundige expressies om de interne efficiëntie te vergroten. Daarom moet u geen procedure gebruiken Function in een rekenkundige expressie wanneer de functie de waarde van variabelen in dezelfde expressie wijzigt.

Asynchrone functies

Met de functie Async kunt u asynchrone functies aanroepen zonder expliciete callbacks te gebruiken of uw code handmatig te splitsen over meerdere functies of lambda-expressies.

Als u een functie markeert met de Asynchrone modifier, kunt u de operator Await in de functie gebruiken. Wanneer het besturingselement een Await expressie in de Async functie bereikt, keert het besturingselement terug naar de aanroeper en wordt de voortgang van de functie onderbroken totdat de wachtende taak is voltooid. Wanneer de taak is voltooid, kan de uitvoering worden hervat in de functie.

Notitie

Een Async procedure keert terug naar de aanroeper wanneer het het eerste wachtende object tegenkomt dat nog niet is voltooid, of het einde van de Async procedure wordt bereikt, afhankelijk van wat zich het eerst voordoet.

Een Async functie kan een retourtype of Task<TResult>Task. Hieronder ziet u een voorbeeld van een Async functie met een retourtype Task<TResult> .

Een Async functie kan geen ByRef-parameters declareren.

Een subinstructie kan ook worden gemarkeerd met de Async wijzigingsfunctie. Dit wordt voornamelijk gebruikt voor gebeurtenis-handlers, waarbij een waarde niet kan worden geretourneerd. Een AsyncSub procedure kan niet worden gewacht en de aanroeper van een AsyncSub procedure kan geen uitzonderingen ondervangen die door de Sub procedure worden gegenereerd.

Zie Asynchrone programmering met Asynchroon programmeren met Async and Await, Control Flow in Async Programs en Async Return Types voor meer informatie over Async functies.

Iterator-functies

Een iterator-functie voert een aangepaste iteratie uit voor een verzameling, zoals een lijst of matrix. Een iterator-functie gebruikt de Yield-instructie om elk element één voor één te retourneren. Wanneer een Rendement-instructie is bereikt, wordt de huidige locatie in de code onthouden. De uitvoering wordt opnieuw gestart vanaf die locatie wanneer de iterator-functie de volgende keer wordt aangeroepen.

U roept een iterator aan vanuit clientcode met behulp van een For Each... Volgende verklaring.

Het retourtype van een iteratorfunctie kan zijnIEnumerable, IEnumerable<T>of IEnumeratorIEnumerator<T>.

Zie Iterators voor meer informatie.

Voorbeeld 1

In het volgende voorbeeld wordt de Function instructie gebruikt om de naam, parameters en code te declareren die de hoofdtekst van een Function procedure vormen. Met ParamArray de wijzigingsfunctie kan de functie een variabel aantal argumenten accepteren.

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

Voorbeeld 2

In het volgende voorbeeld wordt de functie aangeroepen die in het voorgaande voorbeeld is gedeclareerd.

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

Voorbeeld 3

In het volgende voorbeeld DelayAsync is dit een AsyncFunction retourtype Task<TResult>. DelayAsync heeft een Return instructie die een geheel getal retourneert. Daarom moet de functiedeclaratie van DelayAsync de behoeften een retourtype Task(Of Integer)hebben. Omdat het retourtype is Task(Of Integer), produceert de evaluatie van de Await expressie in DoSomethingAsync een geheel getal. Dit wordt in deze verklaring gedemonstreerd: Dim result As Integer = Await delayTask.

De startButton_Click procedure is een voorbeeld van een Async Sub procedure. Omdat DoSomethingAsync dit een Async functie is, moet de taak voor de aanroep DoSomethingAsync worden gewacht, zoals in de volgende instructie wordt gedemonstreerd: Await DoSomethingAsync() De startButton_ClickSub procedure moet worden gedefinieerd met de Async wijzigingsfunctie omdat deze een Await expressie heeft.

' 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

Zie ook