Delen via


Subinstructie (Visual Basic)

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

Syntaxis

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

generator

  • attributelist

    Optioneel. Zie de lijst met kenmerken.

  • Partial

    Optioneel. Geeft de definitie van een gedeeltelijke methode aan. Zie gedeeltelijke methoden.

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

  • name

    Vereist. Naam van de procedure. Zie Gedeclareerde elementnamen. Als u een constructorprocedure voor een klasse wilt maken, stelt u de naam van een Sub procedure in op het New trefwoord. Zie Objectlevensduur voor meer informatie: Hoe objecten worden gemaakt en vernietigd.

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

  • Implements

    Optioneel. Geeft aan dat deze procedure een of meer Sub 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 Sub 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 met instructies die binnen deze procedure moeten worden uitgevoerd.

  • End Sub

    Hiermee wordt de definitie van deze procedure beëindigd.

Opmerkingen

Alle uitvoerbare code moet zich in een procedure bevindt. Gebruik een Sub procedure als u geen waarde wilt retourneren aan de aanroepende code. Gebruik een Function procedure als u een waarde wilt retourneren.

Een subprocedure definiëren

U kunt een Sub procedure alleen definiëren op moduleniveau. De declaratiecontext voor een subprocedure 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.

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

Als de procedure het Implements trefwoord gebruikt, moet de betreffende klasse of structuur 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 Sub (in definedname) definieert, hoeft echter niet overeen te komen met de naam van deze procedure (in name).

Terugkeren vanuit een subprocedure

Wanneer een Sub procedure terugkeert naar de aanroepende code, gaat de uitvoering verder met de instructie na de instructie die deze heeft genoemd.

In het volgende voorbeeld ziet u een retour van een Sub procedure.

Sub mySub(ByVal q As String)
    Return
End Sub

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

Een subprocedure aanroepen

U roept een Sub procedure aan met behulp van de procedurenaam in een instructie en volgt die naam vervolgens met de argumentenlijst tussen haakjes. U kunt de haakjes alleen weglaten als u geen argumenten opgeeft. Uw code is echter beter leesbaar als u altijd de haakjes opneemt.

Een Sub procedure en een Function procedure kunnen parameters hebben en een reeks instructies uitvoeren. Een Function procedure retourneert echter een waarde en een Sub procedure niet. Daarom kunt u geen procedure in een expressie gebruiken Sub .

U kunt het Call trefwoord gebruiken wanneer u een Sub procedure aanroept, maar dat trefwoord wordt niet aanbevolen voor de meeste toepassingen. Zie Oproepinstructie voor meer informatie.

Visual Basic rangschikt soms rekenkundige expressies om de interne efficiëntie te vergroten. Als uw lijst met argumenten daarom expressies bevat die andere procedures aanroepen, moet u er niet van uitgaan dat deze expressies in een bepaalde volgorde worden aangeroepen.

Asynchrone subprocedures

Met behulp van 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 procedure markeert met de Asynchrone wijziging, kunt u de operator Await in de procedure gebruiken. Wanneer het besturingselement een Await expressie in de Async procedure bereikt, keert het besturingselement terug naar de aanroeper en wordt de voortgang in de procedure opgeschort totdat de wachtende taak is voltooid. Wanneer de taak is voltooid, kan de uitvoering in de procedure worden hervat.

Notitie

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

U kunt ook een functie-instructie markeren met de Async wijzigingsfunctie. Een Async functie kan een retourtype of Task<TResult> Task. Verderop in dit onderwerp ziet u een Async functie met een retourtype Task<TResult>.

AsyncSub procedures worden voornamelijk gebruikt voor gebeurtenis-handlers, waarbij een waarde niet kan worden geretourneerd. Een Async Sub procedure kan niet worden gewacht en de aanroeper van een Async Sub procedure kan geen uitzonderingen vangen die de Sub procedure genereert.

Een Async procedure kan geen ByRef-parameters declareren.

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

Voorbeeld 1

In het volgende voorbeeld wordt de Sub instructie gebruikt om de naam, parameters en code te definiëren die de hoofdtekst van een Sub procedure vormen.

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

Voorbeeld 2

In het volgende voorbeeld DelayAsync is dit een Async Function retourtype Task<TResult>. DelayAsync heeft een Return instructie die een geheel getal retourneert. Daarom moet de functiedeclaratie van DelayAsync een retourtype Task(Of Integer)hebben. Omdat het retourtype isTask(Of Integer), produceert de evaluatie van de Await expressie in DoSomethingAsync een geheel getal, zoals in de volgende instructie wordt weergegeven: 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 weergegeven: Await DoSomethingAsync() De startButton_Click Sub 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