Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
attributelistOpcjonalny. Zobacz Lista atrybutów.
accessmodifierOpcjonalny. Może być jednym z następujących elementów:
Zobacz Poziomy dostępu w Visual Basic.
proceduremodifiersOpcjonalny. Może być jednym z następujących elementów:
MustOverride OverridesNotOverridable Overrides
SharedOpcjonalny. Zobacz Udostępnione.
ShadowsOpcjonalny. Zobacz Cienie.
AsyncOpcjonalny. Zobacz Async.
IteratorOpcjonalny. Zobacz Iterator.
nameWymagany. Nazwa procedury. Zobacz Nazwy zadeklarowanych elementów.
typeparamlistOpcjonalny. Lista parametrów typu dla procedury ogólnej. Zobacz Typ listy.
parameterlistOpcjonalny. Lista lokalnych nazw zmiennych reprezentujących parametry tej procedury. Zobacz Lista parametrów.
returntypeWymagane, jeśli
Option Strictma wartośćOn. Typ danych wartości zwracanej przez tę procedurę.ImplementsOpcjonalny. Wskazuje, że ta procedura implementuje co najmniej jedną
Functionprocedurę zdefiniowaną w interfejsie zaimplementowanym przez tę procedurę zawierającą klasę lub strukturę. Zobacz Implements, instrukcja.implementslistWymagane w przypadku
Implementsdostarczenia.FunctionLista wdrożonych procedur.implementedprocedure [ , implementedprocedure ... ]Każda z nich
implementedprocedurema następującą składnię i części:interface.definednameElement opis interfaceWymagany. Nazwa interfejsu zaimplementowanego przez tę procedurę zawierającą klasę lub strukturę. definednameWymagany. Nazwa, za pomocą której procedura jest zdefiniowana w pliku interface.HandlesOpcjonalny. Wskazuje, że ta procedura może obsługiwać co najmniej jedno określone zdarzenie. Zobacz Dojścia.
eventlistWymagane w przypadku
Handlesdostarczenia. Lista zdarzeń obsługiwanych przez tę procedurę.eventspecifier [ , eventspecifier ... ]Każda z nich
eventspecifierma następującą składnię i części:eventvariable.eventElement opis eventvariableWymagany. Zmienna obiektu zadeklarowana z typem danych klasy lub struktury, która wywołuje zdarzenie. eventWymagany. Nazwa zdarzenia, które obsługuje ta procedura. statementsOpcjonalny. Blok instrukcji do wykonania w ramach tej procedury.
End FunctionKoń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 FunctionSub 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 AsyncSub 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 DelayAsyncAsync, Function 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_ClickSub 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