Function – příkaz (Visual Basic)
Deklaruje název, parametry a kód definující Function proceduru.
Syntax
[ <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části
attributelistNepovinný parametr. Viz Seznam atributů.
accessmodifierNepovinný parametr. Může to být jedna z následujících možností:
proceduremodifiersNepovinný parametr. Může to být jedna z následujících možností:
MustOverride OverridesNotOverridable Overrides
SharedNepovinný parametr. Viz Sdílené .
ShadowsNepovinný parametr. Viz Stíny.
AsyncNepovinný parametr. Viz asynchronní .
IteratorNepovinný parametr. Viz Iterátor.
namePovinná hodnota. Název procedury. Viz Deklarované názvy elementů.
typeparamlistNepovinný parametr. Seznam parametrů typu pro obecnou proceduru Viz Seznam typů.
parameterlistNepovinný parametr. Seznam názvů místních proměnných představujících parametry tohoto postupu. Viz Seznam parametrů.
returntypeVyžaduje se,
Option Strictpokud jeOn. Datový typ hodnoty vrácené tímto postupem.ImplementsNepovinný parametr. Označuje, že tento postup implementuje jeden nebo více procedur, z nichž každá je definována v rozhraní implementované třídou nebo strukturou
Functiontéto procedury. Viz Implements – příkaz.implementslistVyžaduje se,
Implementspokud je zadaný. SeznamFunctionimplementované procedury.implementedprocedure [ , implementedprocedure ... ]Každá z nich má následující syntaxi a
implementedprocedurečásti:interface.definednameČást Popis interfacePovinná hodnota. Název rozhraní implementované tímto postupem obsahující třídu nebo strukturu. definednamePovinná hodnota. Název, podle kterého je procedura definována v interface.HandlesNepovinný parametr. Označuje, že tento postup může zpracovávat jednu nebo více konkrétních událostí. Viz Popisovače.
eventlistVyžaduje se,
Handlespokud je zadaný. Seznam událostí, které tento postup zpracovává.eventspecifier [ , eventspecifier ... ]Každá z nich má následující syntaxi a
eventspecifierčásti:eventvariable.eventČást Popis eventvariablePovinná hodnota. Objektová proměnná deklarovaná s datovým typem třídy nebo struktury, která vyvolává událost. eventPovinná hodnota. Název události, která tento postup zpracovává. statementsNepovinný parametr. Blok příkazů, které se budou v rámci tohoto postupu provádět.
End FunctionUkončí definici tohoto postupu.
Poznámky
Veškerý spustitelný kód musí být uvnitř procedury. Každý postup je zase deklarován v rámci třídy, struktury nebo modulu, který je označován jako obsahující třída, struktura nebo modul.
Pokud chcete vrátit hodnotu do volajícího kódu, použijte Function proceduru. V opačném případě použijte Sub proceduru.
Definování funkce
Proceduru můžete Function definovat pouze na úrovni modulu. Kontext deklarace funkce proto musí být třída, struktura, modul nebo rozhraní a nesmí to být zdrojový soubor, obor názvů, procedura nebo blok. Další informace najdete v tématu Kontexty deklarace a Výchozí úrovně přístupu.
Function Procedury ve výchozím nastavení mají 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 vrací. Můžete zadat libovolný datový typ nebo název výčtu, strukturu, třídu nebo rozhraní. Pokud parametr nezadáte, returntype vrátí procedura Object hodnotu .
Pokud tento postup používá klíčové slovo , musí mít obsahující třída nebo struktura také příkaz, který bezprostředně Implements následuje jeho příkaz nebo Implements Class Structure . Příkaz Implements musí obsahovat každé rozhraní, které je zadáno v implementslist . Název, podle kterého rozhraní definuje (v souboru ), se ale nemusí shodovat s názvem tohoto postupu Function definedname (v name ).
Poznámka
Výrazy lambda můžete použít k definování vnořování výrazů funkce. Další informace najdete v tématu Výrazy funkcí a výrazy lambda.
Vrácení z funkce
Když se Function procedura vrátí do volajícího kódu, provádění pokračuje s příkazem, který následuje za příkazem , který volal proceduru .
Pokud chcete z funkce vrátit hodnotu, 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í návratovou 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í návratovou hodnotu k názvu funkce a pak pomocí příkazu vrátí myFunction Exit Function hodnotu .
Function MyFunction(ByVal j As Integer) As Double
MyFunction = 3.87 * j
Exit Function
End Function
Příkazy Exit Function Return a způsobí okamžitý ukončení Function procedury. Libovolný počet příkazů Exit Function a se může objevit kdekoli v postupu a můžete Return kombinovat příkazy Exit Function a Return .
Pokud Exit Function použijete bez přiřazení hodnoty name k , procedura vrátí výchozí hodnotu pro datový typ zadaný v returntype . Pokud returntype parametr nezadáte, procedura vrátí Nothing , což je výchozí hodnota pro Object .
Volání funkce
Proceduru Function zavoláte pomocí názvu procedury následované seznamem argumentů v závorkách ve výrazu. Závorky můžete vynechat pouze v případě, že nezadáte žádné argumenty. Pokud ale vždy zahrníte závorky, bude váš kód čitelný.
Proceduru Function voláte stejným způsobem jako jakoukoli funkci knihovny, jako je 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. Použití Call klíčového slova se ve většině případů nedoporučuje. Další informace najdete v tématu Call – příkaz.
Visual Basic někdy změní uspořádání aritmetických výrazů, aby se zvýšila interní efektivita. Z tohoto důvodu byste neměli používat proceduru v aritmetickém výrazu, když funkce změní hodnotu proměnných Function 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 výrazu ve funkci, ovládací prvek se vrátí volajícímu a průběh ve funkci je pozastaven až do dokončení Await Async čekající úlohy. Po dokončení úlohy může provádění pokračovat ve funkci .
Poznámka
Procedura se vrátí volajícímu, když buď narazí na první čekající objekt, který ještě není dokončený, nebo se dostane na konec procedury (podle toho, co nastane Async Async dřív).
Funkce Async může mít návratový typ nebo Task<TResult> Task . Níže je uvedený Async příklad funkce, která Task<TResult> má návratový typ .
Funkce Async nemůže deklarovat žádné parametry ByRef.
Příkaz Sub lze také označit Async modifikátorem . To se primárně používá pro obslužné rutiny událostí, kde hodnotu nelze vrátit. Proceduru nelze očekávat a volající procedury nemůže zachytit výjimky, které jsou Async Sub Async Sub vyvolány Sub procedurou.
Další informace o funkcích najdete v tématu Asynchronní programování s modifikátorem Async a operátorem Await, řízení Flow v asynchronních programech a Async Asynchronní návratové typy .
Funkce iterátoru
Funkce iterátoru provádí vlastní iteraci kolekce, například seznamu nebo pole. Funkce iterátoru používá příkaz Yield k vrácení každého prvku po jednom. Při dosažení příkazu Yield se aktuální umístění v kódu zapamatovat. Provádění se z tohoto umístění restartuje při příštím volání funkce iterátoru.
Iterátor voláte z klientského kódu pomocí metody For Each... Další příkaz.
Návratový typ funkce iterátoru může být IEnumerable , IEnumerable<T> , nebo IEnumerator 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. ParamArrayModifikátor umožňuje funkci přijmout proměnlivý 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 DelayAsync je objekt , který má Async Function návratový typ Task<TResult> . DelayAsync má Return příkaz, který vrací celé číslo. Proto musí mít deklarace DelayAsync funkce návratový typ Task(Of Integer) . Vzhledem k tomu, že návratový typ je Task(Of Integer) , vyhodnocení Await výrazu v vytvoří celé DoSomethingAsync číslo. To je znázorněno v tomto příkazu: Dim result As Integer = Await delayTask .
Procedura startButton_Click je příkladem Async Sub procedury. Vzhledem k tomu, že je funkce, musí být úloha pro volání DoSomethingAsync funkce očekávána, jak ukazuje Async DoSomethingAsync následující příkaz: Await DoSomethingAsync() . Procedura startButton_Click Sub musí být definována Async modifikátorem , 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