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
Argomento |
Definizione |
attrlist |
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 |
Facoltativo. Consente di specificare il tipo di codice che può accedere al delegato, ad esempio uno dei seguenti:
È possibile specificare Protected Friend per consentire l'accesso dal codice incluso nella classe del delegato, in una classe derivata o nello stesso assembly. |
Shadows |
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 |
Obbligatoria. Nome del tipo delegato. È necessario che sia conforme alle convenzioni di denominazione standard delle variabili. |
typeparamlist |
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 |
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).
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)
In (modificatore generico) (Visual Basic)
Out (modificatore generico) (Visual Basic)
Concetti
Tipi generici in Visual Basic (Visual Basic)