Function – příkaz (Visual Basic)
Deklaruje název, parametry a kód, které definují proceduru Function
.
Syntaxe
[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async | Iterator ]
Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist | Handles eventlist ]
[ statements ]
[ Exit Function ]
[ statements ]
End Function
Součástky
attributelist
Nepovinné. Viz seznam atributů.
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.
Iterator
Nepovinné. Viz Iterátor.
name
Povinný: Název postupu. Viz Deklarované názvy elementů.
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ů.
returntype
Vyžaduje se, pokud
Option Strict
jeOn
. Datový typ hodnoty vrácené tímto postupem.Implements
Nepovinné. Označuje, že tento postup implementuje jeden nebo více
Function
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.Function
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í provést v rámci tohoto postupu.
End Function
Ukončí definici tohoto postupu.
Poznámky
Veškerý spustitelný kód musí být uvnitř procedury. Každý postup je následně deklarován v rámci třídy, struktury nebo modulu, který se označuje jako obsahující třídu, strukturu nebo modul.
Pokud chcete vrátit hodnotu do volajícího kódu, použijte proceduru Function
. Jinak použijte proceduru Sub
.
Definování funkce
Proceduru Function
můžete definovat pouze na úrovni modulu. Kontext deklarace funkce 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.
Function
výchozí nastavení pro veřejný přístup. Jejich úrovně přístupu můžete upravit pomocí modifikátorů přístupu.
Procedura Function
může deklarovat datový typ hodnoty, kterou procedura vrátí. Můžete zadat libovolný datový typ nebo název výčtu, struktury, třídy nebo rozhraní. Pokud parametr nezadáte returntype
, vrátí Object
se procedura .
Pokud tento postup používá Implements
klíčové slovo, obsahující třída nebo struktura musí mít Implements
také 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 Function
(v definedname
) však nemusí odpovídat názvu tohoto postupu (v name
).
Poznámka:
Výrazy lambda můžete použít k definování vložených výrazů funkce. Další informace naleznete v tématu Výraz funkce a výrazy lambda.
Vrácení z funkce
Když se procedura Function
vrátí do volajícího kódu, provádění pokračuje příkazem, který následuje za příkazem, který volal proceduru.
Pokud chcete vrátit hodnotu z funkce, můžete ji buď přiřadit k názvu funkce, nebo ji zahrnout do Return
příkazu.
Příkaz Return
současně přiřadí vrácenou hodnotu a ukončí funkci, jak ukazuje následující příklad.
Function MyFunction(ByVal j As Integer) As Double
Return 3.87 * j
End Function
Následující příklad přiřadí vrácenou hodnotu k názvu myFunction
funkce a pak použije příkaz Exit Function
k vrácení.
Function MyFunction(ByVal j As Integer) As Double
MyFunction = 3.87 * j
Exit Function
End Function
Příkazy Exit Function
a Return
příkazy způsobují okamžité ukončení Function
procedury. Libovolný počet Exit Function
příkazů a Return
příkazů se může objevit kdekoli v postupu a můžete kombinovat Exit Function
a Return
příkazy.
Pokud použijete Exit Function
bez přiřazení hodnoty name
, vrátí procedura výchozí hodnotu pro datový typ, který je zadán v returntype
. Pokud returntype
není zadán, procedura vrátí Nothing
, což je výchozí hodnota pro Object
.
Volání funkce
Proceduru Function
zavoláte pomocí názvu procedury, za kterou následuje seznam argumentů v závorkách ve výrazu. 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.
Zavoláte proceduru Function
stejným způsobem, jakým voláte libovolnou funkci knihovny, například Sqrt
, Cos
nebo ChrW
.
Funkci můžete také volat pomocí klíčového Call
slova. V takovém případě se návratová hodnota ignoruje. Ve většině případů se použití klíčového Call
slova nedoporučuje. 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 byste neměli používat proceduru Function
v aritmetickém výrazu, když funkce změní hodnotu proměnných ve stejném výrazu.
Asynchronní funkce
Funkce Async umožňuje vyvolat asynchronní funkce bez použití explicitních zpětných volání nebo ručního rozdělení kódu mezi více funkcí nebo výrazů lambda.
Pokud funkci označíte modifikátorem Async , můžete ve funkci použít operátor Await . Když ovládací prvek dosáhne Await
výrazu Async
ve funkci, ovládací prvek se vrátí volajícímu a průběh funkce se pozastaví, dokud se nečekaný úkol dokončí. Po dokončení úlohy může provádění ve funkci pokračovat.
Poznámka:
Procedura Async
se vrátí volajícímu, když dojde buď k prvnímu očekávanému objektu, který ještě není dokončený, nebo se dostane na konec Async
procedury podle toho, co nastane dříve.
Funkce Async
může mít návratový Task<TResult> typ nebo Task. Příklad Async
funkce, která má návratový typ Task<TResult> , je uveden níže.
Funkce Async
nemůže deklarovat žádné parametry ByRef .
Dílčí příkaz lze také označit modifikátoremAsync
. To se primárně používá 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 vyvolané Sub
postupem.
Další informace o Async
funkcích naleznete v tématu Asynchronní programování pomocí Async a Await, Tok řízení v asynchronních programech a asynchronní návratové typy.
Funkce iterátoru
Funkce iterátoru provádí vlastní iteraci v kolekci, například seznam nebo pole. Funkce iterátoru používá příkaz Yield k vrácení každého prvku vždy po druhém. Při dosažení příkazu Yield se zapamatuje aktuální umístění v kódu. Spuštění se restartuje z daného umístění při příštím volání funkce iterátoru.
Iterátor z klientského kódu zavoláte pomocí příkazu For Each... Další příkaz.
Návratový typ funkce iterátoru může být IEnumerable, IEnumerable<T>, IEnumerator, nebo IEnumerator<T>.
Další informace najdete v tématu Iterátory.
Příklad 1
Následující příklad používá Function
příkaz k deklaraci názvu, parametrů a kódu, který tvoří tělo Function
procedury. ParamArray
Modifikátor umožňuje funkci přijmout proměnný počet argumentů.
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
Příklad 2
Následující příklad vyvolá funkci deklarovanou v předchozím příkladu.
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
Příklad 3
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ý typ Task(Of Integer)
. Vzhledem k tomu, že návratový typ je Task(Of Integer)
, vyhodnocení výrazu Await
v DoSomethingAsync
vytvoří celé číslo. To je znázorněno v tomto příkazu: 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