Condividi tramite


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

Vedi anche

Estensioni componenti per .NET e UWP