Sdílet prostřednictvím


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í:

    Viz úrovně Accessu v jazyce Visual Basic.

  • proceduremodifiers

    Nepovinné. Může to být jedna z následujících možností:

  • 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 je On. 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í Objectse 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, Cosnebo 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 . DelayAsyncReturn 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

Viz také