Istruzione Function (Visual Basic)Function Statement (Visual Basic)

Dichiara il nome, i parametri e il codice che definiscono una Function routine.Declares the name, parameters, and code that define a Function procedure.

SintassiSyntax

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

PartiParts

  • attributelist

    Facoltativa.Optional. Vedere elenco attributi.See Attribute List.

  • accessmodifier

    Facoltativa.Optional. Può essere uno dei seguenti:Can be one of the following:

    Vedere livelli di accesso in Visual Basic.See Access levels in Visual Basic.

  • proceduremodifiers

    Facoltativa.Optional. Può essere uno dei seguenti:Can be one of the following:

  • Shared

    Facoltativa.Optional. Vedere Shared.See Shared.

  • Shadows

    Facoltativa.Optional. Vedere Shadows.See Shadows.

  • Async

    Facoltativa.Optional. Vedere Async.See Async.

  • Iterator

    Facoltativa.Optional. Vedere iteratore.See Iterator.

  • name

    Obbligatorio.Required. Nome della procedura.Name of the procedure. Vedere Declared Element Names.See Declared Element Names.

  • typeparamlist

    Facoltativa.Optional. Elenco di parametri di tipo per una routine generica.List of type parameters for a generic procedure. Vedere elenco dei tipi.See Type List.

  • parameterlist

    Facoltativa.Optional. Elenco di nomi di variabili locali che rappresentano i parametri di questa procedura.List of local variable names representing the parameters of this procedure. Vedere elenco di parametri.See Parameter List.

  • returntype

    Obbligatorio se Option Strict è On .Required if Option Strict is On. Tipo di dati del valore restituito da questa procedura.Data type of the value returned by this procedure.

  • Implements

    Facoltativa.Optional. Indica che questa procedura implementa una o più Function procedure, ognuna delle quali è definita in un'interfaccia implementata dalla classe o dalla struttura contenitore di questa procedura.Indicates that this procedure implements one or more Function procedures, each one defined in an interface implemented by this procedure's containing class or structure. Vedere istruzione Implements.See Implements Statement.

  • implementslist

    Necessario se si fornisce Implements.Required if Implements is supplied. Elenco delle routine Function implementate.List of Function procedures being implemented.

    implementedprocedure [ , implementedprocedure ... ]

    Ogni implementedprocedure presenta la sintassi e le parti seguenti:Each implementedprocedure has the following syntax and parts:

    interface.definedname

    PartePart DescrizioneDescription
    interface Obbligatorio.Required. Nome di un'interfaccia implementata dalla classe o dalla struttura contenitore di questa procedura.Name of an interface implemented by this procedure's containing class or structure.
    definedname Obbligatorio.Required. Nome mediante il quale la routine viene definita in interface.Name by which the procedure is defined in interface.
  • Handles

    Facoltativa.Optional. Indica che questa procedura può gestire uno o più eventi specifici.Indicates that this procedure can handle one or more specific events. Vedere handle.See Handles.

  • eventlist

    Necessario se si fornisce Handles.Required if Handles is supplied. Elenco di eventi gestiti da questa procedura.List of events this procedure handles.

    eventspecifier [ , eventspecifier ... ]

    Ogni eventspecifier presenta la sintassi e le parti seguenti:Each eventspecifier has the following syntax and parts:

    eventvariable.event

    PartePart DescrizioneDescription
    eventvariable Obbligatorio.Required. Variabile oggetto dichiarata con il tipo di dati della classe o della struttura che genera l'evento.Object variable declared with the data type of the class or structure that raises the event.
    event Obbligatorio.Required. Nome dell'evento gestito da questa procedura.Name of the event this procedure handles.
  • statements

    Facoltativa.Optional. Blocco di istruzioni da eseguire all'interno di questa procedura.Block of statements to be executed within this procedure.

  • End Function

    Termina la definizione di questa procedura.Terminates the definition of this procedure.

CommentiRemarks

Tutto il codice eseguibile deve trovarsi all'interno di una routine.All executable code must be inside a procedure. Ogni procedura, a sua volta, viene dichiarata all'interno di una classe, di una struttura o di un modulo a cui viene fatto riferimento come classe, struttura o modulo contenitore.Each procedure, in turn, is declared within a class, a structure, or a module that is referred to as the containing class, structure, or module.

Per restituire un valore al codice chiamante, utilizzare una Function stored procedure; in caso contrario, utilizzare una Sub routine.To return a value to the calling code, use a Function procedure; otherwise, use a Sub procedure.

Definizione di una funzioneDefining a Function

È possibile definire una Function procedura solo a livello di modulo.You can define a Function procedure only at the module level. 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 procedura o un blocco.Therefore, the declaration context for a function must be a class, a structure, a module, or an interface and can't be a source file, a namespace, a procedure, or a block. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.For more information, see Declaration Contexts and Default Access Levels.

Functionper impostazione predefinita, le procedure sono con accesso pubblico.Function procedures default to public access. È possibile modificare i livelli di accesso con i modificatori di accesso.You can adjust their access levels with the access modifiers.

Una Function procedura può dichiarare il tipo di dati del valore restituito dalla stored procedure.A Function procedure can declare the data type of the value that the procedure returns. È possibile specificare qualsiasi tipo di dati o il nome di un'enumerazione, una struttura, una classe o un'interfaccia.You can specify any data type or the name of an enumeration, a structure, a class, or an interface. Se non si specifica il returntype parametro, la procedura restituisce Object .If you don't specify the returntype parameter, the procedure returns Object.

Se questa routine usa la Implements parola chiave, la classe o la struttura contenitore deve avere anche un' Implements istruzione che segue immediatamente la relativa Class Structure istruzione o.If this procedure uses the Implements keyword, the containing class or structure must also have an Implements statement that immediately follows its Class or Structure statement. L' Implements istruzione deve includere ogni interfaccia specificata in implementslist .The Implements statement must include each interface that's specified in implementslist. Tuttavia, il nome con cui un'interfaccia definisce Function (in definedname ) non deve corrispondere al nome di questa procedura (in name ).However, the name by which an interface defines the Function (in definedname) doesn't need to match the name of this procedure (in name).

Nota

È possibile utilizzare le espressioni lambda per definire espressioni di funzione inline.You can use lambda expressions to define function expressions inline. Per altre informazioni, vedere espressione di funzione ed espressioni lambda.For more information, see Function Expression and Lambda Expressions.

Restituzione da una funzioneReturning from a Function

Quando la Function procedura viene restituita al codice chiamante, l'esecuzione continua con l'istruzione che segue l'istruzione che ha chiamato la procedura.When the Function procedure returns to the calling code, execution continues with the statement that follows the statement that called the procedure.

Per restituire un valore da una funzione, è possibile assegnare il valore al nome della funzione o includerlo in un' Return istruzione.To return a value from a function, you can either assign the value to the function name or include it in a Return statement.

L' Return istruzione assegna simultaneamente il valore restituito e chiude la funzione, come illustrato nell'esempio seguente.The Return statement simultaneously assigns the return value and exits the function, as the following example shows.

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 l' Exit Function istruzione per restituire.The following example assigns the return value to the function name myFunction and then uses the Exit Function statement to return.

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

Le Exit Function Return istruzioni e generano un'uscita immediata da una Function routine.The Exit Function and Return statements cause an immediate exit from a Function procedure. Qualsiasi numero di Exit Function Return istruzioni e può comparire in qualsiasi punto della procedura ed è possibile combinare le Exit Function Return istruzioni e.Any number of Exit Function and Return statements can appear anywhere in the procedure, and you can mix Exit Function and Return statements.

Se si utilizza Exit Function senza assegnare un valore a name , la stored procedure restituisce il valore predefinito per il tipo di dati specificato in returntype .If you use Exit Function without assigning a value to name, the procedure returns the default value for the data type that's specified in returntype. Se returntype non è specificato, la procedura restituisce Nothing , che rappresenta il valore predefinito per Object .If returntype isn't specified, the procedure returns Nothing, which is the default value for Object.

Chiamata di una funzioneCalling a Function

È possibile chiamare una Function stored procedure utilizzando il nome della procedura, seguito dall'elenco di argomenti tra parentesi, in un'espressione.You call a Function procedure by using the procedure name, followed by the argument list in parentheses, in an expression. È possibile omettere le parentesi solo se non si forniscono argomenti.You can omit the parentheses only if you aren't supplying any arguments. Tuttavia, il codice è più leggibile se si includono sempre le parentesi.However, your code is more readable if you always include the parentheses.

È possibile chiamare una Function stored procedure nello stesso modo in cui si chiama qualsiasi funzione di libreria, ad esempio Sqrt , Cos o ChrW .You call a Function procedure the same way that you call any library function such as Sqrt, Cos, or ChrW.

È anche possibile chiamare una funzione usando la Call parola chiave.You can also call a function by using the Call keyword. In tal caso, il valore restituito viene ignorato.In that case, the return value is ignored. CallNella maggior parte dei casi non è consigliabile usare la parola chiave.Use of the Call keyword isn't recommended in most cases. Per ulteriori informazioni, vedere istruzione Call.For more information, see Call Statement.

Visual Basic a volte riorganizza le espressioni aritmetiche per aumentare l'efficienza interna.Visual Basic sometimes rearranges arithmetic expressions to increase internal efficiency. Per questo motivo, non è consigliabile utilizzare una Function stored procedure in un'espressione aritmetica quando la funzione modifica il valore delle variabili nella stessa espressione.For that reason, you shouldn't use a Function procedure in an arithmetic expression when the function changes the value of variables in the same expression.

Funzioni asincroneAsync Functions

La funzionalità asincrona consente di richiamare funzioni asincrone senza usare callback espliciti o suddividere manualmente il codice in più funzioni o espressioni lambda.The Async feature allows you to invoke asynchronous functions without using explicit callbacks or manually splitting your code across multiple functions or lambda expressions.

Se si contrassegna una funzione con il modificatore Async , è possibile usare l'operatore await nella funzione.If you mark a function with the Async modifier, you can use the Await operator in the function. Quando il controllo raggiunge un' Await espressione nella Async funzione, il controllo torna al chiamante e l'avanzamento nella funzione viene sospeso fino al completamento dell'attività attesa.When control reaches an Await expression in the Async function, control returns to the caller, and progress in the function is suspended until the awaited task completes. Al termine dell'attività, l'esecuzione può riprendere nella funzione.When the task is complete, execution can resume in the function.

Nota

Una Async routine restituisce al chiamante quando rileva il primo oggetto atteso che non è ancora completo o raggiunge la fine della Async procedura, a seconda di quale si verifica per primo.An Async procedure returns to the caller when either it encounters the first awaited object that’s not yet complete, or it gets to the end of the Async procedure, whichever occurs first.

Una Async funzione può avere un tipo restituito di Task<TResult> o Task .An Async function can have a return type of Task<TResult> or Task. Di seguito è riportato un esempio di una Async funzione con un tipo restituito Task<TResult> .An example of an Async function that has a return type of Task<TResult> is provided below.

Una Async funzione non può dichiarare parametri ByRef .An Async function cannot declare any ByRef parameters.

Un' istruzione Sub può anche essere contrassegnata con il Async modificatore.A Sub Statement can also be marked with the Async modifier. Viene utilizzato principalmente per i gestori eventi, in cui non è possibile restituire un valore.This is primarily used for event handlers, where a value cannot be returned. Una Async Sub routine non può essere attesa e il chiamante di una Async Sub routine non può intercettare le eccezioni generate dalla Sub procedura.An Async Sub procedure can't be awaited, and the caller of an Async Sub procedure can't catch exceptions that are thrown by the Sub procedure.

Per altre informazioni sulle Async funzioni, vedere programmazione asincrona con Async e await, flusso di controllo in programmi asincronie tipi restituiti asincroni.For more information about Async functions, see Asynchronous Programming with Async and Await, Control Flow in Async Programs, and Async Return Types.

Funzioni iteratoreIterator Functions

Una funzione iteratore esegue un'iterazione personalizzata su una raccolta, ad esempio un elenco o una matrice.An iterator function performs a custom iteration over a collection, such as a list or array. Una funzione iteratore usa l'istruzione yield per restituire un elemento alla volta.An iterator function uses the Yield statement to return each element one at a time. Quando viene raggiunta un'istruzione yield , viene memorizzata la posizione corrente nel codice.When a Yield statement is reached, the current location in code is remembered. L'esecuzione viene riavviata a partire da quella posizione la volta successiva che viene chiamata la funzione iteratore.Execution is restarted from that location the next time the iterator function is called.

È possibile chiamare un iteratore dal codice client usando un per ogni... Istruzione successiva .You call an iterator from client code by using a For Each…Next statement.

Il tipo restituito di una funzione iteratore può essere IEnumerable , IEnumerable<T> , IEnumerator o IEnumerator<T> .The return type of an iterator function can be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.

Per ulteriori informazioni, vedere iteratori.For more information, see Iterators.

EsempioExample

Nell'esempio seguente viene utilizzata l' Function istruzione per dichiarare il nome, i parametri e il codice che formano il corpo di una Function routine.The following example uses the Function statement to declare the name, parameters, and code that form the body of a Function procedure. Il ParamArray modificatore consente alla funzione di accettare un numero variabile di argomenti.The ParamArray modifier enables the function to accept a variable number of arguments.

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

EsempioExample

Nell'esempio seguente viene richiamata la funzione dichiarata nell'esempio precedente.The following example invokes the function declared in the preceding example.

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

EsempioExample

Nell'esempio seguente DelayAsync è un oggetto Async Function che ha un tipo restituito Task<TResult> .In the following example, DelayAsync is an Async Function that has a return type of Task<TResult>. DelayAsync ha un'istruzione Return che restituisce un numero intero.DelayAsync has a Return statement that returns an integer. La dichiarazione di funzione di DelayAsync deve quindi avere un tipo restituito Task(Of Integer) .Therefore the function declaration of DelayAsync needs to have a return type of Task(Of Integer). Poiché il tipo restituito è Task(Of Integer) , la valutazione dell' Await espressione in DoSomethingAsync genera un numero intero.Because the return type is Task(Of Integer), the evaluation of the Await expression in DoSomethingAsync produces an integer. Questa operazione viene illustrata in questa istruzione: Dim result As Integer = Await delayTask .This is demonstrated in this statement: Dim result As Integer = Await delayTask.

La startButton_Click procedura è un esempio di Async Sub procedura.The startButton_Click procedure is an example of an Async Sub procedure. Poiché DoSomethingAsync è una Async funzione, l'attività per la chiamata a DoSomethingAsync deve essere attesa, come illustrato nell'istruzione seguente: Await DoSomethingAsync() .Because DoSomethingAsync is an Async function, the task for the call to DoSomethingAsync must be awaited, as the following statement demonstrates: Await DoSomethingAsync(). La startButton_Click Sub procedura deve essere definita con il Async modificatore perché contiene un' Await espressione.The startButton_Click Sub procedure must be defined with the Async modifier because it has an Await expression.

' 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 ancheSee also