Udostępnij za pośrednictwem


Function — Instrukcja (Visual Basic)

Deklaruje nazwę, parametry i kod definiujący procedurę Function .

Składnia

[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async | Iterator ]
Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist | Handles eventlist ]
    [ statements ]
    [ Exit Function ]
    [ statements ]
End Function

generatora

  • attributelist

    Opcjonalny. Zobacz Lista atrybutów.

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

  • Shared

    Opcjonalny. Zobacz Udostępnione.

  • Shadows

    Opcjonalny. Zobacz Cienie.

  • Async

    Opcjonalny. Zobacz Async.

  • Iterator

    Opcjonalny. Zobacz Iterator.

  • name

    Wymagany. Nazwa procedury. Zobacz Nazwy zadeklarowanych elementów.

  • 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.

  • returntype

    Wymagane, jeśli Option Strict ma wartość On. Typ danych wartości zwracanej przez tę procedurę.

  • Implements

    Opcjonalny. Wskazuje, że ta procedura implementuje co najmniej jedną Function procedurę zdefiniowaną w interfejsie zaimplementowanym przez tę procedurę zawierającą klasę lub strukturę. Zobacz Implements, instrukcja.

  • implementslist

    Wymagane w przypadku Implements dostarczenia. Function 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 wykonania w ramach tej procedury.

  • End Function

    Kończy definicję tej procedury.

Uwagi

Cały kod wykonywalny musi znajdować się wewnątrz procedury. Każda procedura jest z kolei zadeklarowana w klasie, strukturze lub module nazywanym zawierającym klasą, strukturą lub modułem.

Aby zwrócić wartość do kodu wywołującego, użyj procedury. W przeciwnym razie użyj Function Sub procedury.

Definiowanie funkcji

Można zdefiniować procedurę Function tylko na poziomie modułu. W związku z tym kontekst deklaracji dla funkcji musi 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.

Function procedury domyślne dla dostępu publicznego. Możesz dostosować ich poziomy dostępu za pomocą modyfikatorów dostępu.

Procedura Function może zadeklarować typ danych wartości zwracanej przez procedurę. Można określić dowolny typ danych lub nazwę wyliczenia, struktury, klasy lub interfejsu. Jeśli nie określisz parametru returntype , procedura zwraca wartość Object.

Jeśli ta procedura używa słowa kluczowego Implements , zawierająca klasę lub strukturę musi również mieć instrukcję Implements , która natychmiast następuje po jego Class instrukcji lub Structure . Instrukcja Implements musi zawierać każdy interfejs określony w pliku implementslist. Jednak nazwa, za pomocą której interfejs definiuje Function element (w definedname), nie musi być zgodna z nazwą tej procedury (w pliku name).

Uwaga

Wyrażenia lambda umożliwiają definiowanie wyrażeń funkcji wbudowanych. Aby uzyskać więcej informacji, zobacz Wyrażenia funkcji i Wyrażenia lambda.

Zwracanie z funkcji

Function Gdy procedura powróci do kodu wywołującego, wykonanie będzie kontynuowane z instrukcją zgodną z instrukcją, która nazwała procedurę.

Aby zwrócić wartość z funkcji, możesz przypisać wartość do nazwy funkcji lub dołączyć ją w instrukcji Return .

Instrukcja Return jednocześnie przypisuje wartość zwracaną i zamyka funkcję, jak pokazano w poniższym przykładzie.

Function MyFunction(ByVal j As Integer) As Double
    Return 3.87 * j
End Function

Poniższy przykład przypisuje wartość zwracaną do nazwy myFunction funkcji, a następnie używa Exit Function instrukcji do zwrócenia.

Function MyFunction(ByVal j As Integer) As Double
    MyFunction = 3.87 * j
    Exit Function
End Function

Instrukcje Exit Function i Return powodują natychmiastowe wyjście z Function procedury. Dowolna liczba instrukcji Exit Function i Return może być wyświetlana w dowolnym miejscu procedury i można mieszać Exit Function i Return instrukcje.

W przypadku użycia Exit Function bez przypisania wartości do namemetody procedura zwraca wartość domyślną dla typu danych określonego w elemecie returntype. Jeśli returntype nie zostanie określona, procedura zwraca Nothingwartość , która jest wartością domyślną dla elementu Object.

Wywołanie funkcji

Procedura jest wywoływana Function przy użyciu nazwy procedury, a następnie listy argumentów w nawiasach w wyrażeniu. Nawiasy można pominąć tylko wtedy, gdy nie podajesz żadnych argumentów. Jednak kod jest bardziej czytelny, jeśli zawsze uwzględniasz nawiasy.

Procedura jest wywoływana w taki sam sposób, w jaki wywołujesz dowolną Function funkcję biblioteki, taką jak Sqrt, Coslub ChrW.

Funkcję można również wywołać za pomocą słowa kluczowego Call . W takim przypadku wartość zwracana jest ignorowana. Użycie słowa kluczowego Call nie jest zalecane w większości przypadków. 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 nie należy używać Function procedury w wyrażeniu arytmetycznym, gdy funkcja zmienia wartość zmiennych w tym samym wyrażeniu.

Funkcje asynchroniczne

Funkcja asynchroniczna umożliwia wywoływanie funkcji asynchronicznych bez użycia jawnych wywołań zwrotnych lub ręcznego dzielenia kodu między wiele funkcji lub wyrażeń lambda.

Jeśli oznaczysz funkcję za pomocą modyfikatora asynchronicznego , możesz użyć operatora Await w funkcji . Gdy kontrolka Await osiągnie wyrażenie w Async funkcji, kontrolka powróci do elementu wywołującego i postęp w funkcji zostanie zawieszony do momentu zakończenia oczekiwanego zadania. Po zakończeniu zadania wykonywanie może być wznowione w funkcji.

Uwaga

Procedura Async powraca do obiektu wywołującego, gdy napotka pierwszy oczekiwany obiekt, który nie został jeszcze ukończony, lub nastąpi na końcu Async procedury, w zależności od tego, co nastąpi wcześniej.

Funkcja Async może mieć zwracany typ Task<TResult> lub Task. Poniżej przedstawiono przykład Async funkcji, która ma zwracany Task<TResult> typ.

Funkcja Async nie może zadeklarować żadnych parametrów ByRef .

Instrukcję sub można również oznaczyć modyfikatorem Async . Jest to używane głównie w przypadku procedur obsługi zdarzeń, w których nie można zwrócić wartości. Async Sub Nie można oczekiwać na procedurę, a obiekt Sub Async wywołujący procedury nie może przechwytywać wyjątków zgłaszanych przez proceduręSub.

Aby uzyskać więcej informacji na temat Async funkcji, zobacz Asynchroniczne programowanie za pomocą asynchronicznego i await, przepływu sterowania w programach asynchronicznych i asynchronicznych typów zwracanych.

Funkcje iteracyjne

Funkcja iteratora wykonuje niestandardową iterację w kolekcji, taką jak lista lub tablica. Funkcja iteratora używa instrukcji Yield , aby zwrócić każdy element pojedynczo. Gdy zostanie osiągnięta instrukcja Yield , zostanie zapamiętana bieżąca lokalizacja w kodzie. Wykonanie jest uruchamiane ponownie z tej lokalizacji przy następnym wywołaniu funkcji iteratora.

Iterator jest wywoływany z kodu klienta przy użyciu elementu Dla każdego... Następna instrukcja.

Zwracany typ funkcji iteratora może mieć IEnumerablewartość , IEnumerable<T>, IEnumeratorlub IEnumerator<T>.

Aby uzyskać więcej informacji, zobacz Iteratory.

Przykład 1

W poniższym przykładzie użyto instrukcji Function w celu zadeklarowania nazwy, parametrów i kodu, które tworzą treść Function procedury. Modyfikator ParamArray umożliwia funkcji akceptowanie zmiennej liczby argumentów.

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

Przykład 2

Poniższy przykład wywołuje funkcję zadeklarowaną w poprzednim przykładzie.

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

Przykład 3

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 DelayAsync tym deklaracja funkcji musi mieć zwracany typ Task(Of Integer). Ponieważ zwracany typ to Task(Of Integer), ocena Await wyrażenia w DoSomethingAsync obiekcie generuje liczbę całkowitą. Jest to pokazane w tej 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

Zobacz też