Istruzione Function (Visual Basic)

Dichiara il nome, i parametri e il codice che definiscono una Function routine.

Sintassi

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

Parti

  • attributelist

    facoltativo. Vedere Elenco attributi.

  • accessmodifier

    facoltativo. Può essere uno dei seguenti:

    Vedere Livelli di accesso in Visual Basic.

  • proceduremodifiers

    facoltativo. Può essere uno dei seguenti:

  • Shared

    facoltativo. Vedere Condiviso.

  • Shadows

    facoltativo. Vedere Ombreggiature.

  • Async

    facoltativo. Vedere Async.

  • Iterator

    facoltativo. Vedere Iterator.

  • name

    Obbligatorio. Nome della procedura. Vedere Declared Element Names.

  • typeparamlist

    facoltativo. Elenco di parametri di tipo per una routine generica. Vedere Type List.

  • parameterlist

    facoltativo. Elenco di nomi di variabili locali che rappresentano i parametri di questa procedura. Vedere Elenco di parametri.

  • returntype

    Obbligatorio se Option Strict è On . Tipo di dati del valore restituito da questa procedura.

  • Implements

    facoltativo. Indica che questa procedura implementa una o più routine, ognuna definita in un'interfaccia implementata dalla classe o dalla struttura che Function la contiene. Vedere Istruzione Implements.

  • implementslist

    Necessario se si fornisce Implements. Elenco delle routine Function implementate.

    implementedprocedure [ , implementedprocedure ... ]

    Ogni implementedprocedure presenta la sintassi e le parti seguenti:

    interface.definedname

    Parte Descrizione
    interface Obbligatorio. Nome di un'interfaccia implementata dalla classe o dalla struttura contenitore di questa procedura.
    definedname Obbligatorio. Nome mediante il quale la routine viene definita in interface.
  • Handles

    facoltativo. Indica che questa procedura può gestire uno o più eventi specifici. Vedere Handle.

  • eventlist

    Necessario se si fornisce Handles. Elenco di eventi che questa routine gestisce.

    eventspecifier [ , eventspecifier ... ]

    Ogni eventspecifier presenta la sintassi e le parti seguenti:

    eventvariable.event

    Parte Descrizione
    eventvariable Obbligatorio. Variabile oggetto dichiarata con il tipo di dati della classe o della struttura che genera l'evento.
    event Obbligatorio. Nome dell'evento gestito da questa procedura.
  • statements

    facoltativo. Blocco di istruzioni da eseguire all'interno di questa procedura.

  • End Function

    Termina la definizione di questa procedura.

Commenti

Tutto il codice eseguibile deve essere all'interno di una routine. Ogni routine, a sua volta, viene dichiarata all'interno di una classe, una struttura o un modulo denominato classe, struttura o modulo contenitore.

Per restituire un valore al codice chiamante, utilizzare una Function routine ; in caso contrario, utilizzare una routine Sub .

Definizione di una funzione

È possibile definire una Function routine solo a livello di modulo. Pertanto, il contesto di dichiarazione per una funzione deve essere una classe, una struttura, un modulo o un'interfaccia e non può essere un file di origine, uno spazio dei nomi, una routine o un blocco. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.

Function Le procedure vengono utilizzate per impostazione predefinita per l'accesso pubblico. È possibile modificare i livelli di accesso con i modificatori di accesso.

Una Function routine può dichiarare il tipo di dati del valore restituito dalla routine. È possibile specificare qualsiasi tipo di dati o nome di un'enumerazione, una struttura, una classe o un'interfaccia. Se non si specifica il returntype parametro , la procedura restituisce Object .

Se questa routine usa la parola chiave , anche la classe o la struttura che lo contiene deve avere un'istruzione che Implements Implements segue immediatamente Class l'istruzione o Structure . ImplementsL'istruzione deve includere ogni interfaccia specificata in implementslist . Tuttavia, il nome con cui un'interfaccia definisce (in ) non deve corrispondere al nome Function definedname di questa procedura (in name ).

Nota

È possibile usare le espressioni lambda per definire le espressioni di funzione inline. Per altre informazioni, vedere Espressione di funzione ed espressioni lambda.

Restituzione da una funzione

Quando la Function routine torna al codice chiamante, l'esecuzione continua con l'istruzione che segue l'istruzione che ha chiamato la routine.

Per restituire un valore da una funzione, è possibile assegnare il valore al nome della funzione o includerlo in Return un'istruzione .

ReturnL'istruzione assegna contemporaneamente il valore restituito ed esce dalla funzione , come illustrato nell'esempio seguente.

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

Nell'esempio seguente viene assegnato il valore restituito al nome della funzione myFunction e quindi viene utilizzata Exit Function l'istruzione per restituire .

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

Le Exit Function istruzioni Return e causano un'uscita immediata da una Function routine. Qualsiasi numero di Exit Function istruzioni e può essere presente in qualsiasi punto della procedura ed è possibile combinare le istruzioni Return e Exit Function Return .

Se si usa senza assegnare un valore a , la procedura restituisce il valore predefinito per il tipo di Exit Function name dati specificato in returntype . Se returntype non viene specificato, la procedura restituisce , Nothing che è il valore predefinito per Object .

Chiamata di una funzione

Per chiamare una Function routine, usare il nome della routine, seguito dall'elenco di argomenti tra parentesi, in un'espressione. È possibile omettere le parentesi solo se non si specificano argomenti. Tuttavia, il codice è più leggibile se si includono sempre le parentesi.

Una routine viene chiamata nello stesso modo in cui si chiama qualsiasi funzione di libreria, Function ad esempio , o Sqrt Cos ChrW .

È anche possibile chiamare una funzione usando la parola Call chiave . In tal caso, il valore restituito viene ignorato. L'uso Call della parola chiave non è consigliato nella maggior parte dei casi. Per altre informazioni, vedere Istruzione Call.

Visual Basic talvolta riorganizza le espressioni aritmetiche per aumentare l'efficienza interna. Per questo motivo, non è consigliabile usare una routine in un'espressione aritmetica quando la funzione modifica il valore delle variabili Function nella stessa espressione.

Funzioni asincrone

La funzionalità asincrona consente di richiamare funzioni asincrone senza usare callback espliciti o suddividere manualmente il codice tra più funzioni o espressioni lambda.

Se si contrassegna una funzione con il modificatore Async, è possibile usare l'operatore Await nella funzione . Quando il controllo raggiunge un'espressione nella funzione, il controllo torna al chiamante e lo stato di avanzamento della funzione viene sospeso fino al completamento Await Async dell'attività attesa. Al termine dell'attività, l'esecuzione può riprendere nella funzione .

Nota

Una routine torna al chiamante quando rileva il primo oggetto atteso che non è ancora completo o arriva alla fine della routine, a seconda di quale si verifica Async Async per primo.

Una Async funzione può avere un tipo restituito o Task<TResult> Task . Di seguito è riportato Async un esempio di funzione con un tipo Task<TResult> restituito di .

Una Async funzione non può dichiarare parametri ByRef.

Un'istruzione Sub può anche essere contrassegnata con il Async modificatore . Viene usato principalmente per i gestori eventi, in cui non è possibile restituire un valore. Una routine non può essere attesa e il chiamante di una routine non può rilevare le eccezioni Async Sub generate dalla Async Sub Sub procedura.

Per altre informazioni sulle funzioni, vedere Programmazione asincrona con Async e Await , Controllo Flow nei programmi Async asincronie Tipi restituiti asincroni.

Funzioni dell'iteratore

Una funzione iteratore esegue un'iterazione personalizzata su una raccolta, ad esempio un elenco o una matrice. Una funzione iteratore usa l'istruzione Yield per restituire ogni elemento uno alla volta. Quando viene raggiunta un'istruzione Yield, viene memorizzata la posizione corrente nel codice. L'esecuzione viene riavviata a partire da quella posizione la volta successiva che viene chiamata la funzione iteratore.

Si chiama un iteratore dal codice client usando for each... Istruzione successiva.

Il tipo restituito di una funzione iteratore può essere IEnumerable IEnumerable<T> , , o IEnumerator IEnumerator<T> .

Per altre informazioni, vedere Iteratori.

Esempio 1

Nell'esempio seguente viene Function utilizzata l'istruzione per dichiarare il nome, i parametri e il codice che formano il corpo di una Function routine. Il ParamArray modificatore consente alla funzione di accettare un numero variabile di argomenti.

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

Esempio 2

Nell'esempio seguente viene richiamata la funzione dichiarata nell'esempio precedente.

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

Esempio 3

Nell'esempio seguente è DelayAsync un oggetto con un tipo Async Function restituito di Task<TResult> . DelayAsync ha un'istruzione Return che restituisce un numero intero. La dichiarazione di funzione di DelayAsync deve pertanto avere un tipo restituito di Task(Of Integer) . Poiché il tipo restituito è Task(Of Integer) , la valutazione Await dell'espressione in DoSomethingAsync produce un numero intero. Questo è illustrato in questa istruzione: Dim result As Integer = Await delayTask .

La startButton_Click procedura è un esempio di Async Sub procedura. Poiché è una funzione, l'attività per la chiamata a deve essere attesa, come DoSomethingAsync Async illustrato DoSomethingAsync nell'istruzione seguente: Await DoSomethingAsync() . La startButton_Click Sub routine deve essere definita con il Async modificatore perché dispone di Await un'espressione.

' 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

Vedi anche