Istruzione Function (Visual Basic)

Consente di dichiarare il nome, i parametri e il codice con i quali si definisce una routine Function.

[ <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

Termine

Definizione

attributelist

Opzionale.Vedere Elenco degli attributi.

accessmodifier

Opzionale.ad esempio uno dei seguenti:

Vedere Livelli di accesso in Visual Basic.

proceduremodifiers

Opzionale.ad esempio uno dei seguenti:

Shared

Opzionale.Vedere Shared.

Shadows

Opzionale.Vedere Shadows.

Async

Opzionale.Vedere Asincrono.

Iterator

Opzionale.Vedere Iteratore.

name

Necessario.Nome della routine.Vedere Nomi di elementi dichiarati (Visual Basic).

typeparamlist

Opzionale.Elenco dei parametri di tipo per una routine generica.Vedere Elenco dei tipi.

parameterlist

Opzionale.Elenco dei nomi di variabili locali che rappresentano i parametri di questa routine.Vedere Elenco dei parametri (Visual Basic).

returntype

Obbligatoria se Option Strict è On.Tipo di dati del valore restituito da questa routine.

Implements

Opzionale.Consente di indicare che questa procedura implementa una o più routine Function, ognuna definita in un'interfaccia implementata della classe o dalla struttura contenente la routine.Vedere Istruzione Implements.

implementslist

Obbligatoria se viene fornita Implements.Elenco di routine Function implementate.

implementedprocedure [ , implementedprocedure ... ]

Ogni implementedprocedure presenta la sintassi e le parti seguenti:

interface.definedname

ParteDescrizione
interface Necessario.Nome di un'interfaccia implementata dalla classe o struttura contenente questa routine.
definedname Necessario.Nome mediante il quale la routine viene definita in interface.

Handles

Opzionale.Consente di indicare che questa routine è in grado di gestire uno o più eventi specifici.Vedere Clausola Handles (Visual Basic).

eventlist

Obbligatoria se viene fornita Handles.Elenco di eventi gestiti dalla routine.

eventspecifier [ , eventspecifier ... ]

Ogni eventspecifier presenta la sintassi e le parti seguenti:

eventvariable.event

ParteDescrizione
eventvariable Necessario.La variabile oggetto dichiarata con il tipo di dati della classe o della struttura che genera l'evento.
event Necessario.Nome dell'evento gestito dalla routine.

statements

Opzionale.Blocco di istruzioni da eseguire in questa routine.

EndFunction

Consente di terminare la definizione di questa routine.

Note

È necessario che il codice eseguibile sia inserito all'interno di una routine.Ogni routine, a sua volta, è dichiarata in una classe, una struttura, o un modulo denominato nella classe, struttura, o il modulo contenitore.

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

Definizione di funzione

È possibile definire una routine Function solo a livello di modulo.Di conseguenza, il contesto della dichiarazione di 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, oppure un blocco.Per ulteriori informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti (Visual Basic).

L'impostazione predefinita delle routine Function è l'accesso pubblico.È possibile modificarne i livelli di accesso mediante gli appositi modificatori.

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

Se questa procedura viene utilizzata la parola chiave Implements, la classe o la struttura contenente deve essere un'istruzione Implements immediatamente successivo alla relativa istruzione Structure o Class.L'istruzione Implements deve includere ogni interfaccia specificata in implementslist.Tuttavia, il nome da un'interfaccia definisce Function (in definedname) non deve corrispondere al nome della routine (in name).

[!NOTA]

È possibile utilizzare espressioni lambda per definire le espressioni di funzione inline.Per ulteriori informazioni, vedere Espressione di funzione (Visual Basic) e Espressioni lambda (Visual Basic).

Chiusura di una funzione

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

Per ottenere un valore da una funzione, è possibile assegnare il valore al nome di funzione oppure includerlo in un'istruzione Return.

L'istruzione Return contemporaneamente assegna il valore restituito e chiude la funzione, come illustrato di seguito.

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

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

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

Le istruzioni Exit Function e Return provocano un'uscita immediata da una routine Function.Qualsiasi numero delle istruzioni Exit Function e Return può essere visualizzato in un punto qualsiasi della procedura ed è possibile mescolare le istruzioni Exit Function e Return.

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

Chiamata di una funzione

Per chiamare una routine Function, è necessario specificarne il nome seguito dall'elenco degli argomenti racchiuso tra parentesi, all'interno di un'espressione.È possibile omettere le parentesi solo se non viene fornito alcun argomento.Il codice sarà tuttavia più leggibile se si includono sempre le parentesi.

Chiama una routine Function la stessa procedura utilizzata per chiamare qualsiasi funzione di libreria come Sqrt, Cos, o ChrW.

È inoltre possibile chiamare una funzione utilizzando la parola chiave Call.In tal caso, il valore restituito viene ignorato.L'utilizzo della parola chiave Call non è consigliato nella maggior parte dei casi.Per ulteriori informazioni, vedere Istruzione Call (Visual Basic).

 In Visual Basic le espressioni aritmetiche vengono a volte riorganizzate per migliorare il grado di efficienza interno.Per questo motivo, non è necessario seguire una procedura Function in un'espressione aritmetica quando le modifiche di funzione il valore delle variabili nella stessa espressione.

Funzioni di Async

La funzionalità di Async consente a un vantaggio le funzioni asincrone senza utilizzare i callback espliciti o dividere manualmente il codice attraverso più funzioni o le espressioni lambda.

Se si contrassegna una funzione con il modificatore Asincrono, è possibile utilizzare l'operatore Attendere nella funzione.Quando il controllo raggiunge un'espressione Await nella funzione Async, il controllo torna il chiamante e lo stato di avanzamento nella funzione viene sospeso finché l'attività attesa non completi.Quando l'attività è stata completata, l'esecuzione può riattivare la funzione.

[!NOTA]

Restituisce la routine Async al chiamante quando uno viene rilevato l'oggetto innanzitutto attesa che non è ancora completa, ottiene o alla fine della routine Async, qualsiasi si verifica prima.

Una funzione Async può avere un tipo restituito Task<TResult> o Task.Un esempio di funzione Async con un tipo restituito Task<TResult> viene fornito in.

Una funzione Async impossibile dichiarare parametri ByRef.

Istruzione Sub (Visual Basic) può essere contrassegnato con il modificatore Async.Ciò viene utilizzata principalmente per i gestori eventi, in cui un valore non può essere restituito.Una routine AsyncSub non può essere sospeso e il chiamante di una routine AsyncSub impossibile intercettare le eccezioni generate dalla routine Sub.

Per ulteriori informazioni sulle funzioni Async, vedere Programmazione asincrona con Async e Await (C# e Visual Basic), Flusso di controllo in programmi asincroni (C# e Visual Basic)e Tipi restituiti asincroni (C# e Visual Basic).

Funzioni di iteratore

Una funzione iteratori esegue un'iterazione personalizzata in una raccolta, come un elenco o una matrice.Una funzione iteratori utilizza l'istruzione yield per restituire ogni elemento uno alla volta.Quando un'istruzione yield viene raggiunto, la posizione corrente nel codice viene memorizzata.L'esecuzione viene riavviata da tale percorso alla successiva chiamata la funzione di iteratore è denominata.

Chiama un iteratore dal codice client utilizzando un'istruzione For Each… next.

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

Per ulteriori informazioni, vedere Iteratori (C# e Visual Basic).

Esempio

Nell'esempio illustrato di seguito l'istruzione Function viene utilizzata per dichiarare il nome, i parametri e il codice che formano il corpo di una routine Function.Il modificatore ParamArray 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

Nell'esempio illustrato di seguito viene invocata 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

Nell'esempio seguente, DelayAsync è AsyncFunction con un tipo restituito Task<TResult>.DelayAsync ha un'istruzione Return che restituisce un Integer.Pertanto la dichiarazione di funzione delle necessità DelayAsync di avere un tipo restituito Task(Of Integer).Poiché il tipo restituito è Task(Of Integer), la valutazione di un'espressione Await in DoSomethingAsync produce un Integer.Ciò è illustrato in questa istruzione: Dim result As Integer = Await delayTask.

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

' 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

Vedere anche

Attività

Procedura: utilizzare una classe generica (Visual Basic)

Risoluzione dei problemi relativi alle routine (Visual Basic)

Riferimenti

Istruzione Sub (Visual Basic)

Elenco dei parametri (Visual Basic)

Istruzione Dim (Visual Basic)

Istruzione Call (Visual Basic)

Clausola Of (Visual Basic)

Espressione di funzione (Visual Basic)

Concetti

Routine Function (Visual Basic)

Matrici di parametri (Visual Basic)

Espressioni lambda (Visual Basic)