Condividi tramite


Istruzione Delegate

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

Termine

Definizione

attrlist

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

accessmodifier

Parametro facoltativo. 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

Parametro facoltativo. Indica che il delegato ridichiara e nasconde un elemento di programmazione omonimo, o un insieme di elementi di overload, di una classe base. È possibile nascondere 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

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

typeparamlist

Parametro facoltativo. Elenco di parametri di tipo per il delegato. I parametri sono separati da una virgola. Se lo si desidera, è possibile dichiarare ogni parametro di tipo come variant utilizzando i modificatori generici In e Out. L'Elenco dei tipi (Visual Basic) deve essere racchiuso tra parentesi e introdotto dalla parola chiave Of.

parameterlist

Parametro facoltativo. Elenco dei parametri passati alla routine al momento della relativa chiamata. L'Elenco dei parametri (Visual Basic) 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 methodnamenon è 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 (Visual Basic).

Per ulteriori informazioni sui delegati, vedere Delegati (Visual Basic).

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 (Visual Basic)

Riferimenti

Operatore AddressOf (Visual Basic)

Clausola Of (Visual Basic)

In (modificatore generico) (Visual Basic)

Out (modificatore generico) (Visual Basic)

Concetti

Tipi generici in Visual Basic (Visual Basic)

Altre risorse

Delegati (Visual Basic)

Covarianza e controvarianza (C# e Visual Basic)