Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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