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