delegato (Estensioni del componente C++)
Dichiara un tipo che rappresenta un puntatore a funzione.
Tutti i runtime
Sia Windows Runtime che Common Language Runtime supportano i delegati.
Osservazioni
delegate è una parola chiave sensibile al contesto. Per ulteriori informazioni, vedere Parole chiave sensibili al contesto (Estensioni del componente C++).
Per rilevare in fase di compilazione se un tipo è un delegato, utilizzare il tratto di tipo __is_delegate(). Per ulteriori informazioni, vedere Supporto del compilatore per tratti di tipo (Estensioni del componente C++).
Windows Runtime
C++/CX supporta i delegati utilizzando la seguente sintassi.
Sintassi
access delegate return-type delegate-type-identifier ([ parameters ])
Parametri
access
(facoltativo) L'accessibilità del delegato, che può essere public (impostazione predefinita) o private. Il prototipo di funzione può anche essere qualificato con le parole chiave volatile o const.return-type
Il tipo restituito del prototipo della funzione.delegate-type-identifier
Il nome del tipo delegato dichiarato.parameters
(Facoltativo) Tipi e identificatori dei prototipi di funzione.
Osservazioni
Utilizzare delegate-type-identifier per dichiarare un evento con lo stesso prototipo del delegato. Per ulteriori informazioni, vedere i delegati (C++/CX).
Requisiti
Opzione del compilatore: /ZW
Common Language Runtime
Il Common Language Runtime supporta i delegati con la seguente sintassi.
Sintassi
access delegate function_declaration
Parametri
access
(facoltativo) L'accessibilità del delegato al di fuori dell'assembly può essere public o private. Il valore predefinito è private. In una classe, un delegato può avere qualsiasi accessibilità.function_declaration
La firma della funzione che può essere associata al delegato. Il tipo restituito di un delegato può essere qualsiasi tipo gestito. Per motivi di interoperabilità, il tipo restituito di un delegato dovrebbe essere un tipo CLS.Per definire un delegato non associato, il primo parametro di function_declaration deve essere il tipo del puntatore this per l'oggetto. Per ulteriori informazioni, vedere delegati non associati.
Osservazioni
I delegati sono multicast: il "puntatore a funzione" può essere associato a uno o più metodi all'interno di una classe gestita. La parola chiave delegate definisce un tipo delegato multicast con una specifica firma del metodo.
Un delegato può anche essere associato a un metodo di una classe di valori, ad esempio ad un metodo statico.
Un delegato presenta le caratteristiche descritte di seguito:
Eredita da System::MulticastDelegate.
Ha un costruttore che accetta due argomenti: un puntatore a una classe gestita o a NULL (nel caso di associazione ad un metodo statico) e un metodo completamente qualificato del tipo specificato.
Ha un metodo denominato Invoke, la cui firma corrisponde alla firma del delegato dichiarata.
Quando il delegato viene invocato, le relative funzioni vengono chiamate nell'ordine in cui sono state associate.
Il valore restituito di un delegato è il valore restituito dall'ultima funzione membro associata.
I delegati non possono essere sottoposti a overload.
I delegati possono essere associati o non associati.
Quando viene creata un'istanza di un delegato associato, il primo argomento è un riferimento ad un oggetto. Il secondo argomento per la creazione di un'istanza del delegato è l'indirizzo di un metodo di un oggetto di una classe gestita o un puntatore a un metodo di un tipo di valore. Il secondo argomento per la creazione di un'istanza del delegato deve assegnare un nome al metodo utilizzando la sintassi completa dell'ambito della classe e applicando l'operatore address-of.
Quando viene creata un'istanza di un delegato non associato, il primo argomento è l'indirizzo di un metodo di un oggetto di una classe gestita o un puntatore a un metodo di un tipo di valore. L'argomento deve assegnare un nome al metodo utilizzando la sintassi completa dell'ambito della classe e applicando l'operatore address-of.
Quando si crea un delegato per una funzione statica o globale, un solo parametro è obbligatorio: la funzione (l'indirizzo della funzione è facoltativo).
Per ulteriori informazioni sui delegati, vedere
Requisiti
Opzione del compilatore: /clr
Esempi
Esempio
Nell'esempio che segue viene illustrato come dichiarare, inizializzare ed invocare i delegati.
// mcppv2_delegate.cpp
// compile with: /clr
using namespace System;
// declare a delegate
public delegate void MyDel(int i);
ref class A {
public:
void func1(int i) {
Console::WriteLine("in func1 {0}", i);
}
void func2(int i) {
Console::WriteLine("in func2 {0}", i);
}
static void func3(int i) {
Console::WriteLine("in static func3 {0}", i);
}
};
int main () {
A ^ a = gcnew A;
// declare a delegate instance
MyDel^ DelInst;
// test if delegate is initialized
if (DelInst)
DelInst(7);
// assigning to delegate
DelInst = gcnew MyDel(a, &A::func1);
// invoke delegate
if (DelInst)
DelInst(8);
// add a function
DelInst += gcnew MyDel(a, &A::func2);
DelInst(9);
// remove a function
DelInst -= gcnew MyDel(a, &A::func1);
// invoke delegate with Invoke
DelInst->Invoke(10);
// make delegate to static function
MyDel ^ StaticDelInst = gcnew MyDel(&A::func3);
StaticDelInst(11);
}
Output