Condividi tramite


Istruzione Delegate

Utilizzato per dichiarare un delegato. Un delegato è un tipo riferimento che fa riferimento a un Shared metodo di un tipo o a un metodo di istanza di un oggetto. Per creare un'istanza di questa classe delegato, è possibile utilizzare qualsiasi procedura con parametri e tipi restituiti corrispondenti. La procedura può quindi essere richiamata in un secondo momento tramite l'istanza del delegato.

Sintassi

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

Parti

Termine Definizione
attrlist Opzionale. Elenco di attributi applicabili a questo delegato. Più attributi sono separati da virgole. È necessario racchiudere l'elenco attributi tra parentesi angolari ("<" e ">").
accessmodifier Opzionale. Specifica il codice che può accedere al delegato. Può essere uno dei seguenti:

- Pubblico. Qualsiasi codice in grado di accedere all'elemento che dichiara il delegato può accedervi.
- Protetto. Solo il codice all'interno della classe del delegato o di una classe derivata può accedervi.
- Amico. Solo il codice all'interno dello stesso assembly può accedere al delegato.
- Privato. Solo il codice all'interno dell'elemento che dichiara il delegato può accedervi.

- Amico protetto Solo il codice all'interno della classe del delegato, una classe derivata o lo stesso assembly può accedere al delegato.
- Privato protetto Solo il codice all'interno della classe del delegato o in una classe derivata nello stesso assembly può accedere al delegato.
Shadows Opzionale. Indica che questo delegato ripete e nasconde un elemento di programmazione denominato in modo identico, o un set di elementi di overload, in una classe base. È possibile nascondere qualsiasi tipo di elemento dichiarato con qualsiasi altro tipo.

Un elemento ombreggiato non è disponibile dall'interno della classe derivata che lo ombreggiato, tranne da dove l'elemento shadowing non è accessibile. Ad esempio, se un Private elemento ombreggiato da un elemento della classe di base, il codice che non dispone dell'autorizzazione per accedere all'elemento accede all'elemento Private della classe base.
Sub Facoltativo, ma Sub o Function deve essere visualizzato. Dichiara questa procedura come routine delegato Sub che non restituisce un valore.
Function Facoltativo, ma Sub o Function deve essere visualizzato. Dichiara questa procedura come routine delegato Function che restituisce un valore.
name Obbligatorio. Nome del tipo delegato; segue le convenzioni di denominazione delle variabili standard.
typeparamlist Opzionale. Elenco di parametri di tipo per questo delegato. Più parametri di tipo sono separati da virgole. Facoltativamente, ogni parametro di tipo può essere dichiarato variant usando In e Out modificatori generici. È necessario racchiudere l'elenco dei tipi tra parentesi e presentarlo con la Of parola chiave .
parameterlist Opzionale. Elenco di parametri passati alla routine quando viene chiamata. È necessario racchiudere l'elenco di parametri tra parentesi.
type Obbligatorio se si specifica una Function routine. Tipo di dati del valore restituito.

Osservazioni:

L'istruzione Delegate definisce il parametro e i tipi restituiti di una classe delegato. Qualsiasi routine con parametri corrispondenti e tipi restituiti può essere usata per creare un'istanza di questa classe delegato. La procedura può quindi essere richiamata in un secondo momento tramite l'istanza del delegato, chiamando il metodo del Invoke delegato.

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

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

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

AddressOf [expression.]methodname

Il tipo in fase di compilazione di expression deve essere il nome di una classe o di un'interfaccia che contiene un metodo con il nome specificato e la cui firma corrisponda a quella della classe delegata. methodname Può essere un metodo condiviso o un metodo di istanza. Il methodname non è facoltativo, anche se si crea un delegato per il metodo predefinito della classe.

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

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

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

Per altre informazioni sui delegati, vedere Delegati.

Esempio

Nell'esempio seguente viene usata l'istruzione Delegate per dichiarare un delegato per operare su due numeri e restituendo un numero. Il DelegateTest metodo accetta un'istanza di un delegato di questo tipo e lo usa per operare su coppie 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