Sub – příkaz (Visual Basic)
Deklaruje název, parametry a kód, které definují proceduru Sub
.
Syntaxe
[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]
[ statements ]
[ Exit Sub ]
[ statements ]
End Sub
Součástky
attributelist
Nepovinné. Viz seznam atributů.
Partial
Nepovinné. Označuje definici částečné metody. Viz částečné metody.
accessmodifier
Nepovinné. Může to být jedna z následujících možností:
proceduremodifiers
Nepovinné. Může to být jedna z následujících možností:
MustOverride Overrides
NotOverridable Overrides
Shared
Nepovinné. Viz Sdílené.
Shadows
Nepovinné. Podívejte se na stíny.
Async
Nepovinné. Viz Async.
name
Povinný: Název postupu. Viz Deklarované názvy elementů. Chcete-li vytvořit proceduru konstruktoru pro třídu, nastavte název
Sub
procedury naNew
klíčové slovo. Další informace naleznete v tématu Životnost objektu: Způsob vytváření a zničení objektů.typeparamlist
Nepovinné. Seznam parametrů typu pro obecný postup Viz seznam typů.
parameterlist
Nepovinné. Seznam názvů místních proměnných představujících parametry tohoto postupu Viz seznam parametrů.
Implements
Nepovinné. Označuje, že tento postup implementuje jeden nebo více
Sub
procedur, každý z nich definovaný v rozhraní implementovaném tímto postupem obsahující třídu nebo strukturu. Viz Implements – příkaz.implementslist
Požadováno, pokud
Implements
je zadáno.Sub
Seznam implementovaných postupůimplementedprocedure [ , implementedprocedure ... ]
Každá z nich
implementedprocedure
má následující syntaxi a části:interface.definedname
Část Popis interface
Požadováno. Název rozhraní implementovaného tímto postupem obsahující třídu nebo strukturu. definedname
Povinný: Název, kterým je procedura definována v interface
.Handles
Nepovinné. Označuje, že tento postup může zpracovat jednu nebo více konkrétních událostí. Viz popisovače.
eventlist
Požadováno, pokud
Handles
je zadáno. Seznam událostí, které tento postup zpracováváeventspecifier [ , eventspecifier ... ]
Každá z nich
eventspecifier
má následující syntaxi a části:eventvariable.event
Část Popis eventvariable
Požadováno. Proměnná objektu deklarovaná s datovým typem třídy nebo struktury, která vyvolá událost. event
Povinný: Název události, která tento postup zpracovává. statements
Nepovinné. Blok příkazů, které se mají spustit v rámci tohoto postupu
End Sub
Ukončí definici tohoto postupu.
Poznámky
Veškerý spustitelný kód musí být uvnitř procedury. Sub
Pokud nechcete vrátit hodnotu volajícímu kódu, použijte postup. Function
Pokud chcete vrátit hodnotu, použijte postup.
Definování dílčí procedury
Proceduru Sub
můžete definovat pouze na úrovni modulu. Kontext deklarace pro dílčí proceduru proto musí být třída, struktura, modul nebo rozhraní a nemůže být zdrojovým souborem, oborem názvů, postupem nebo blokem. Další informace naleznete v tématu Kontexty deklarace a výchozí úrovně přístupu.
Sub
výchozí nastavení pro veřejný přístup. Úrovně přístupu můžete upravit pomocí modifikátorů přístupu.
Pokud procedura Implements
používá klíčové slovo, obsahující třída nebo struktura musí mít Implements
příkaz, který bezprostředně následuje za jeho Class
nebo Structure
příkazem. Příkaz Implements
musí obsahovat každé rozhraní, které je zadáno v implementslist
. Název, kterým rozhraní definuje Sub
(v definedname
) však nemusí odpovídat názvu tohoto postupu (v name
).
Vrácení z dílčí procedury
Když se procedura Sub
vrátí do volajícího kódu, provádění pokračuje příkazem za příkazem, který ho nazval.
Následující příklad ukazuje návrat z Sub
procedury.
Sub mySub(ByVal q As String)
Return
End Sub
Příkazy Exit Sub
a Return
příkazy způsobují okamžité ukončení Sub
procedury. Libovolný počet Exit Sub
příkazů a Return
příkazů se může objevit kdekoli v postupu a můžete kombinovat Exit Sub
a Return
příkazy.
Volání dílčí procedury
Proceduru Sub
zavoláte pomocí názvu procedury v příkazu a potom za tímto názvem se seznamem argumentů v závorkách. Závorky můžete vynechat jenom v případě, že nezadáte žádné argumenty. Kód je ale čitelnější, pokud vždy zahrnete závorky.
Procedura Sub
a procedura Function
mohou mít parametry a provádět řadu příkazů. Procedura Function
ale vrátí hodnotu a procedura Sub
ne. Proto ve výrazu nemůžete použít proceduru Sub
.
Klíčové slovo můžete použít Call
při volání Sub
procedury, ale toto klíčové slovo se nedoporučuje pro většinu použití. Další informace najdete v tématu Příkaz volání.
Visual Basic někdy mění uspořádání aritmetických výrazů, aby se zvýšila interní efektivita. Z tohoto důvodu pokud seznam argumentů obsahuje výrazy, které volají jiné procedury, neměli byste předpokládat, že se tyto výrazy budou volat v určitém pořadí.
Asynchronní dílčí procedury
Pomocí funkce Async můžete vyvolat asynchronní funkce bez použití explicitních zpětných volání nebo ručního rozdělení kódu mezi několik funkcí nebo výrazů lambda.
Pokud označíte proceduru modifikátorem Async , můžete v postupu použít operátor Await . Když ovládací prvek dosáhne Await
výrazu Async
v postupu, ovládací prvek se vrátí volajícímu a průběh v postupu se pozastaví, dokud neskončí očekávaný úkol. Po dokončení úkolu může provádění pokračovat v postupu.
Poznámka:
Procedura Async
se vrátí volajícímu, pokud je nalezen buď první očekávaný objekt, který ještě není dokončený, nebo je dosaženo konce Async
procedury podle toho, co nastane dříve.
Příkaz funkce můžete také označit modifikátoremAsync
. Funkce Async
může mít návratový Task<TResult> typ nebo Task. Příklad dále v tomto tématu ukazuje Async
funkci, která má návratový Task<TResult>typ .
Async
Sub
procedury se primárně používají pro obslužné rutiny událostí, kde nelze vrátit hodnotu. Proceduru Async
Sub
nelze očekávat a volající Sub
Async
procedury nemůže zachytit výjimky, které procedura Sub
vyvolá.
Procedura Async
nemůže deklarovat žádné parametry ByRef .
Další informace o procedurách naleznete v Async
tématu Asynchronní programování pomocí Async a Await, Řízení toku v asynchronních programech a asynchronní návratové typy.
Příklad 1
Následující příklad používá příkaz Sub
k definování názvu, parametrů a kódu, který tvoří tělo 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
Příklad 2
V následujícím příkladu je Async
Function
, DelayAsync
který má návratový Task<TResult>typ . DelayAsync
Return
obsahuje příkaz, který vrací celé číslo. Deklarace funkce DelayAsync
proto musí mít návratový Task(Of Integer)
typ . Vzhledem k tomu, že návratový typ je Task(Of Integer)
, vyhodnocení výrazu Await
v DoSomethingAsync
vytvoří celé číslo, jak ukazuje následující příkaz: Dim result As Integer = Await delayTask
.
Tento startButton_Click
postup je příkladem Async Sub
procedury. Protože DoSomethingAsync
je Async
funkce, úkol volání DoSomethingAsync
musí být očekávána, jak ukazuje následující příkaz: Await DoSomethingAsync()
. Procedura startButton_Click
Sub
musí být definována modifikátorem Async
, protože má Await
výraz.
' 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