Istruzione Delegate

Usata per dichiarare un delegato. Un delegato è un tipo riferimento che fa riferimento a un metodo Shared di un tipo o a un metodo di istanza di un oggetto. Qualsiasi routine con parametri e tipi restituiti corrispondenti può essere usata per creare un'istanza di questa classe di delegato. La routine 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 Facoltativo. Elenco degli attributi applicabili al delegato. Gli attributi sono separati da una virgola. È necessario racchiudere l'Elenco degli attributi tra parentesi angolari ("<" e ">").
accessmodifier Facoltativo. Specifica il tipo di 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 possono 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 Facoltativo. Indica che il delegato ridichiara e nasconde un elemento di programmazione omonimo o un insieme di elementi in 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. Ad esempio, se 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 Facoltativo, ma Sub o Function deve essere visualizzato. Dichiara questa procedura come routine Sub delegato che non restituisce un valore.
Function Facoltativo, ma Sub o Function deve essere visualizzato. Dichiara questa procedura come routine Function delegato che restituisce un valore.
name Obbligatorio. Nome del tipo di delegato, conforme alle convenzioni di denominazione standard delle variabili.
typeparamlist Facoltativo. Elenco di parametri di tipo per questo delegato. Più parametri di tipo sono separati da virgole. Facoltativamente, ogni parametro di tipo può essere dichiarato variante usando i modificatori generici In e Out. È necessario racchiudere l'Elenco dei tipi tra parentesi e presentarlo con la parola chiave Of.
parameterlist Facoltativo. Elenco di parametri passati alla routine quando viene chiamata. L'Elenco dei parametri deve essere racchiuso tra parentesi.
type Obbligatorio se si specifica una routine Function. Tipo di dati del valore restituito.

Osservazioni:

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

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 dell'oggetto. Un argomento di un costruttore di delegati deve essere un riferimento a un metodo o a un'espressione lambda.

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

AddressOf [expression.]methodname

Il tipo in fase di compilazione dell'elemento expression deve essere il nome di una classe o un'interfaccia contenente un metodo con il nome specificato la cui firma corrisponde a quella della classe delegata. Il metodo methodname può essere o un metodo condiviso o un metodo di istanza. methodname non è un elemento 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 in C++.

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 restituire un numero. Il metodo DelegateTest 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

Vedi anche