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:
MustOverride Overrides
NotOverridable Overrides
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 name
metody procedura zwraca wartość domyślną dla typu danych określonego w elemecie returntype
. Jeśli returntype
nie zostanie określona, procedura zwraca Nothing
wartość , 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
, Cos
lub 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