delegate (C++/CLI e C++/CX)
Dichiara un tipo che rappresenta un puntatore a una funzione.
Tutti i runtime
Windows Runtime e Common Language Runtime supportano entrambi delegati.
Osservazioni:
delegate è una parola chiave sensibile al contesto. Per altre informazioni, vedere Parole chiave sensibili al contesto.
Per rilevare in fase di compilazione se un tipo è un delegato, usare la caratteristica di tipo __is_delegate()
. Per altre informazioni, vedere Supporto del compilatore per caratteristiche di tipo.
Windows Runtime
C++/CX supporta i delegati con la sintassi seguente.
Sintassi
access
delegate
return-type
delegate-type-identifier
(
[ parameters ]
)
Parametri
access
(facoltativo) Accessibilità del delegato, che può essere public
(impostazione predefinita) o private
. Il prototipo di funzione può anche essere qualificato con le const
parole chiave o volatile
.
return-type
Tipo restituito del prototipo di funzione.
delegate-type-identifier
Nome del tipo di delegato dichiarato.
parameters
(Facoltativo) Tipi e identificatori del prototipo di funzione.
Osservazioni:
Usare delegate-type-identifier per dichiarare un evento con lo stesso prototipo del delegato. Per altre informazioni, vedere Delegati (C++/CX).
Requisiti
Opzione del compilatore: /ZW
Common Language Runtime
Common Language Runtime supporta i delegati con la sintassi seguente.
Sintassi
access
delegate
function_declaration
Parametri
access
(Facoltativo) L'accessibilità del delegato all'esterno dell'assembly può essere public o private. L'impostazione predefinita è private. All'interno di una classe un delegato può avere qualsiasi accessibilità.
function_declaration
Firma della funzione che può essere associata al delegato. Il tipo restituito di un delegato può essere qualsiasi tipo gestito. Per motivi di interoperabilità, è consigliabile che il tipo restituito di un delegato sia un tipo CLS.
Per definire un delegato non associato, il primo parametro in function_declaration deve essere il tipo del this
puntatore per l'oggetto.
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 di delegato multicast con una firma di metodo specifica.
Un delegato può anche essere associato a un metodo di una classe di valore, ad esempio un metodo statico.
Un delegato ha le caratteristiche seguenti:
Eredita da
System::MulticastDelegate
.Ha un costruttore che accetta due argomenti: un puntatore a una classe gestita oppure NULL (in caso di associazione a un metodo statico) e un metodo completo del tipo specificato.
Ha un metodo denominato
Invoke
, la cui firma corrisponde alla firma del delegato dichiarata.
Quando viene richiamato un delegato, le funzioni del delegato vengono chiamate nell'ordine in cui sono state collegate.
Il valore restituito di un delegato è il valore restituito dell'ultima funzione membro collegata.
Non è possibile eseguire l'overload di delegati.
I delegati possono essere associati o non associati.
Quando si crea un'istanza di un delegato associato, il primo argomento deve essere un riferimento all'oggetto. Il secondo argomento della creazione di un'istanza di un delegato dovrà essere l'indirizzo di un metodo di un oggetto classe gestita o un puntatore a un metodo di un tipo valore. Il secondo argomento della creazione di un'istanza di un delegato deve denominare il metodo con la sintassi di ambito di classe completa e applicare address-of-operator.
Quando si crea un'istanza di un delegato non associato, il primo argomento sarà l'indirizzo di un metodo di un oggetto classe gestita o un puntatore a un metodo di un tipo valore. L'argomento deve denominare il metodo con la sintassi di ambito di classe completa e applicare address-of-operator.
Quando si crea un delegato per una funzione statica o globale, è necessario un solo parametro: la funzione (facoltativamente, l'indirizzo della funzione).
Per altre informazioni sui delegati, vedere
Requisiti
Opzione del compilatore: /clr
Esempi
L'esempio seguente mostra come dichiarare, inizializzare e richiamare 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);
}
in func1 8
in func1 9
in func2 9
in func2 10
in static func3 11