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:
MustOverride Overrides
NotOverridable Overrides
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 naNew
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ą Implements
Class
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>.
Async
Sub
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ący Sub
Async
procedury nie może przechwytywać wyjątków zgłaszanych przez Sub
procedurę.Async
Sub
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 obiekt Async
Function
, 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_Click
Sub
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