Istruzione Delegate

Aggiornamento: novembre 2007

Viene utilizzata per dichiarare un delegato. Per delegato si intende un tipo di riferimento associato a un metodo Shared di un tipo o a un metodo di istanza di un oggetto. Per creare un'istanza della classe delegata, è possibile utilizzare qualsiasi routine con tipi di parametri e tipi restituiti corrispondenti. La routine può in seguito essere richiamata attraverso l'istanza di delegato.

[ <attrlist> ] [ accessmodifier ] _
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]

Parti

  • attrlist
    Facoltativa. Elenco di attributi applicabili al delegato. Gli attributi sono separati da una virgola. È necessario racchiudere l'Elenco degli attributi tra parentesi angolari ("<" e ">").

  • accessmodifier
    Facoltativa. Consente di specificare il tipo di codice che può accedere al delegato, ad esempio uno dei seguenti:

    • Public. Può accedere al delegato qualsiasi codice che sia in grado di accedere all'elemento che lo dichiara.

    • Protected. Può accedere al delegato solo il codice incluso nella relativa classe o in una classe derivata.

    • Friend. Può accedere al delegato solo il codice incluso nello stesso assembly.

    • Private. Può accedere al delegato solo il codice incluso nell'elemento che lo dichiara.

    È possibile specificare Protected Friend per consentire l'accesso dal codice incluso nella classe del delegato, in una classe derivata o nello stesso assembly.

  • Shadows
    Facoltativa. Indica che il delegato ridichiara e nasconde un elemento di programmazione omonimo, o un insieme di elementi di overload, di una classe base. È possibile eseguire lo shadowing di qualsiasi tipo di elemento dichiarato con qualsiasi altro tipo.

    Un elemento nascosto non è disponibile all'interno della classe derivata che lo nasconde, a meno che l'elemento di shadowing sia inaccessibile. Se, ad esempio, un elemento Private nasconde un elemento della classe base, il codice che non dispone dell'autorizzazione per accedere all'elemento Private accede invece all'elemento della classe base.

  • Sub
    Facoltativa. È necessario che sia specificato Sub o Function. Consente di dichiarare la routine come delegata di tipo Sub senza la restituzione di un valore.

  • Function
    Facoltativa. È necessario che sia specificato Sub o Function. Consente di dichiarare la routine come delegata di tipo Function con la restituzione di un valore.

  • name
    Obbligatoria. Nome del tipo delegato. È necessario che sia conforme alle convenzioni di denominazione standard delle variabili.

  • typeparamlist
    Facoltativa. Elenco di parametri di tipo per il delegato. I parametri sono separati da una virgola. L'Elenco dei tipi deve essere racchiuso tra parentesi e introdotto dalla parola chiave Of.

  • parameterlist
    Facoltativa. Elenco dei parametri passati alla routine al momento della relativa chiamata. L'Elenco parametri deve essere racchiuso tra parentesi.

  • type
    Obbligatoria se viene specificata una routine Function. Tipo di dati del valore restituito.

Note

L'istruzione Delegate consente di definire i tipi di parametri e i tipi restituiti di una classe delegata. Per creare un'istanza della classe delegata, è possibile utilizzare qualsiasi routine con tipi di parametri e tipi restituiti corrispondenti. La routine può essere utilizzata in seguito attraverso l'istanza del delegato chiamando il metodo Invoke del delegato.

I delegati possono essere dichiarati a livello di spazio dei nomi, modulo, classe o struttura, ma non all'interno di routine.

Ogni classe delegata definisce un costruttore al quale viene passata la specifica di un metodo di oggetto. Un argomento di un costruttore di delegato deve essere un riferimento a un metodo o a un'espressione lambda.

Per specificare un riferimento a un metodo, utilizzare la seguente sintassi:

AddressOf [expression.]methodname

In fase di compilazione per il tipo di expression è necessario specificare il nome di una classe o di un'interfaccia contenente un metodo con il nome specificato e con firma corrispondente a quella della classe delegata. methodname può essere un metodo condiviso o di istanza ma non è facoltativo, anche se si crea un delegato per il metodo predefinito della classe.

Per specificare un'espressione lambda, utilizzare la seguente sintassi:

Function ([parm As type, parm2 As type2, ...]) expression

La firma della funzione deve corrispondere a quella del tipo delegato. Per ulteriori informazioni sulle espressioni lambda, vedere Espressioni lambda.

Esempio

Nell'esempio riportato di seguito l'istruzione Delegate viene utilizzata per dichiarare un delegato che consenta di eseguire operazioni su due numeri e restituire un numero. Il metodo DelegateTest accetta un'istanza di tale tipo di delegato e la utilizza per eseguire operazioni su una coppia di numeri.

Delegate Function MathOperator( _
    ByVal x As Double, _
    ByVal y As Double _
) As Double

Function AddNumbers( _
    ByVal x As Double, _
    ByVal y As Double _
) As Double
    Return x + y
End Function

Function SubtractNumbers( _
    ByVal x As Double, _
    ByVal y As Double _
) As Double
    Return x - y
End Function

Sub DelegateTest( _
    ByVal x As Double, _
    ByVal op As MathOperator, _
    ByVal y As Double _
)
    Dim ret As Double
    ret = op.Invoke(x, y) ' Call the method.
    MsgBox(ret)
End Sub

Protected Sub Test()
    DelegateTest(5, AddressOf AddNumbers, 3)
    DelegateTest(9, AddressOf SubtractNumbers, 3)
End Sub

Vedere anche

Attività

Procedura: utilizzare una classe generica

Concetti

Tipi generici in Visual Basic

Riferimenti

Operatore AddressOf

Of

Altre risorse

Delegati in Visual Basic