Sub — Instrukcja (Visual Basic)

Deklaruje nazwę, parametry i kod definiujący procedurę Sub .

Składnia

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

generatora

  • attributelist

    Opcjonalny. Zobacz Lista atrybutów.

  • Partial

    Opcjonalny. Wskazuje definicję metody częściowej. Zobacz Metody częściowe.

  • accessmodifier

    Opcjonalny. Może być jednym z następujących elementów:

    Zobacz Poziomy dostępu w Visual Basic.

  • proceduremodifiers

    Opcjonalny. Może być jednym z następujących elementów:

  • Shared

    Opcjonalny. Zobacz Udostępnione.

  • Shadows

    Opcjonalny. Zobacz Cienie.

  • Async

    Opcjonalny. Zobacz Async.

  • name

    Wymagany. Nazwa procedury. Zobacz Nazwy zadeklarowanych elementów. Aby utworzyć procedurę konstruktora dla klasy, ustaw nazwę Sub procedury na New słowo kluczowe . Aby uzyskać więcej informacji, zobacz Okres istnienia obiektu: jak obiekty są tworzone i niszczone.

  • typeparamlist

    Opcjonalny. Lista parametrów typu dla procedury ogólnej. Zobacz Typ listy.

  • parameterlist

    Opcjonalny. Lista lokalnych nazw zmiennych reprezentujących parametry tej procedury. Zobacz Lista parametrów.

  • Implements

    Opcjonalny. Wskazuje, że ta procedura implementuje co najmniej jedną Sub procedurę zdefiniowaną w interfejsie zaimplementowanym przez tę procedurę zawierającą klasę lub strukturę. Zobacz Implements, instrukcja.

  • implementslist

    Wymagane w przypadku Implements dostarczenia. Sub Lista wdrożonych procedur.

    implementedprocedure [ , implementedprocedure ... ]

    Każda z nich implementedprocedure ma następującą składnię i części:

    interface.definedname

    Element opis
    interface Wymagane. Nazwa interfejsu zaimplementowanego przez tę procedurę zawierającą klasę lub strukturę.
    definedname Wymagany. Nazwa, za pomocą której procedura jest zdefiniowana w pliku interface.
  • Handles

    Opcjonalny. Wskazuje, że ta procedura może obsługiwać co najmniej jedno określone zdarzenie. Zobacz Dojścia.

  • eventlist

    Wymagane w przypadku Handles dostarczenia. Lista zdarzeń obsługiwanych przez tę procedurę.

    eventspecifier [ , eventspecifier ... ]

    Każda z nich eventspecifier ma następującą składnię i części:

    eventvariable.event

    Element opis
    eventvariable Wymagane. Zmienna obiektu zadeklarowana z typem danych klasy lub struktury, która wywołuje zdarzenie.
    event Wymagany. Nazwa zdarzenia, które obsługuje ta procedura.
  • statements

    Opcjonalny. Blok instrukcji do uruchomienia w ramach tej procedury.

  • End Sub

    Kończy definicję tej procedury.

Uwagi

Cały kod wykonywalny musi znajdować się wewnątrz procedury. Sub Użyj procedury, jeśli nie chcesz zwracać wartości do kodu wywołującego. Function Użyj procedury, gdy chcesz zwrócić wartość.

Definiowanie procedury podrzędnej

Można zdefiniować procedurę Sub tylko na poziomie modułu. Kontekst deklaracji dla procedury podrzędnej musi zatem być klasą, strukturą, modułem lub interfejsem i nie może być plikiem źródłowym, przestrzenią nazw, procedurą lub blokiem. Aby uzyskać więcej informacji, zobacz Konteksty deklaracji i Domyślne poziomy dostępu.

Sub procedury domyślne dla dostępu publicznego. Możesz dostosować ich poziomy dostępu przy użyciu modyfikatorów dostępu.

Jeśli procedura używa słowa kluczowego Implements , zawierająca klasę lub strukturę musi mieć instrukcję, która jest bezpośrednio zgodna z instrukcją ImplementsClass lub Structure . Instrukcja Implements musi zawierać każdy interfejs określony w pliku implementslist. Jednak nazwa, za pomocą której interfejs definiuje Sub element (in definedname) nie musi być zgodna z nazwą tej procedury (w pliku name).

Zwracanie z procedury podrzędnej

Sub Gdy procedura powróci do kodu wywołującego, wykonanie będzie kontynuowane z instrukcją po instrukcji , która ją nazwała.

W poniższym przykładzie przedstawiono powrót z Sub procedury.

Sub mySub(ByVal q As String)
    Return
End Sub

Instrukcje Exit Sub i Return powodują natychmiastowe wyjście z Sub procedury. Dowolna liczba instrukcji Exit Sub i Return może być wyświetlana w dowolnym miejscu procedury i można mieszać Exit Sub i Return instrukcje.

Wywoływanie procedury podrzędnej

Procedura jest wywoływana Sub przy użyciu nazwy procedury w instrukcji, a następnie po tej nazwie z listą argumentów w nawiasach. Nawiasy można pominąć tylko wtedy, gdy nie podasz żadnych argumentów. Jednak kod jest bardziej czytelny, jeśli zawsze uwzględniasz nawiasy.

Procedura Sub i Function procedura mogą zawierać parametry i wykonywać serię instrukcji. Function Jednak procedura zwraca wartość, a Sub procedura nie. W związku z tym nie można użyć Sub procedury w wyrażeniu.

Słowo kluczowe można użyć Call podczas wywoływania Sub procedury, ale to słowo kluczowe nie jest zalecane w przypadku większości zastosowań. Aby uzyskać więcej informacji, zobacz Call Statement (Instrukcja wywołania).

Visual Basic czasami zmienia rozmieszczenie wyrażeń arytmetycznych w celu zwiększenia wydajności wewnętrznej. Z tego powodu, jeśli lista argumentów zawiera wyrażenia wywołujące inne procedury, nie należy zakładać, że te wyrażenia będą wywoływane w określonej kolejności.

Procedury podrzędne asynchroniczne

Za pomocą funkcji asynchronicznej można wywoływać funkcje asynchroniczne bez użycia jawnych wywołań zwrotnych lub ręcznego dzielenia kodu między wiele funkcji lub wyrażeń lambda.

Jeśli oznaczysz procedurę modyfikatorem asynchronizatora , możesz użyć operatora Await w procedurze . Gdy kontrolka Await osiągnie wyrażenie w procedurze Async , kontrolka powróci do elementu wywołującego i postęp procedury zostanie zawieszony do momentu zakończenia oczekiwanego zadania. Po zakończeniu zadania wykonanie można wznowić w procedurze.

Uwaga

Procedura Async powraca do obiektu wywołującego, gdy napotkano pierwszy oczekiwany obiekt, który nie został jeszcze ukończony, lub osiągnięto koniec Async procedury, w zależności od tego, co nastąpi wcześniej.

Możesz również oznaczyć instrukcję funkcji modyfikatoremAsync. Funkcja Async może mieć zwracany typ Task<TResult> lub Task. W dalszej części tego tematu Async przedstawiono funkcję, która ma zwracany typ Task<TResult>.

AsyncSub procedury są używane głównie w przypadku procedur obsługi zdarzeń, w których nie można zwrócić wartości. Nie można oczekiwać na procedurę, a obiekt wywołującySubAsyncprocedury nie może przechwytywać wyjątków zgłaszanych przez Sub procedurę.AsyncSub

Procedura Async nie może zadeklarować żadnych parametrów ByRef .

Aby uzyskać więcej informacji na temat Async procedur, zobacz Asynchroniczne programowanie za pomocą asynchronicznego i await, przepływu sterowania w programach asynchronicznych i asynchronicznych typów zwracanych.

Przykład 1

W poniższym przykładzie użyto instrukcji Sub do zdefiniowania nazwy, parametrów i kodu, które tworzą treść Sub procedury.

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

Przykład 2

W poniższym przykładzie jest to obiektAsyncFunction, DelayAsync który ma zwracany typ Task<TResult>. DelayAsync zawiera instrukcję Return zwracającą liczbę całkowitą. W związku z tym deklaracja DelayAsync funkcji musi mieć typ zwracany Task(Of Integer). Ponieważ zwracany typ to Task(Of Integer), ocena Await wyrażenia w pliku DoSomethingAsync generuje liczbę całkowitą, jak pokazano w następującej instrukcji: Dim result As Integer = Await delayTask.

Procedura startButton_Click jest przykładem Async Sub procedury. Ponieważ DoSomethingAsync jest funkcją Async , zadanie wywołania DoSomethingAsync musi być oczekiwane, jak pokazano w następującej instrukcji: Await DoSomethingAsync(). Procedura musi być zdefiniowana startButton_ClickSub za pomocą Async modyfikatora, ponieważ zawiera Await wyrażenie.

' 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

Zobacz też