delegate (Extensiones de componentes de C++)

Declara un tipo que representa un puntero a función.

Todos los runtimes

Tanto Windows en tiempo de ejecución como Common Language Runtime son compatibles con delegados.

3z2x4f55.collapse_all(es-es,VS.110).gifComentarios

delegate es una palabra clave contextual.Para obtener más información, vea Palabras clave contextuales (Extensiones de componentes de C++).

Para detectar en tiempo de compilación si un tipo es un delegado, use el rasgo de tipo de __is_delegate().Para obtener más información, vea Compatibilidad de compilador para type traits (Extensiones de componentes de C++).

Windows en tiempo de ejecución

C++/CX admite delegados con la sintaxis siguiente.

3z2x4f55.collapse_all(es-es,VS.110).gifSintaxis

access delegate return-type delegate-type-identifier ([ parameters ])

3z2x4f55.collapse_all(es-es,VS.110).gifParámetros

  • access
    (opcional) La accesibilidad del delegado, que puede ser public (valor predeterminado) o private.El prototipo de función también se puede calificar con las palabras clave const o volatile.

  • return-type
    El tipo de valor devuelto del prototipo de función.

  • identificador de tipo delegado
    Nombre de tipo del delegado declarado.

  • parameters
    (Opcional) Tipos e identificadores del prototipo de función.

3z2x4f55.collapse_all(es-es,VS.110).gifComentarios

Use el identificador de tipo delegado para declarar un evento con el mismo prototipo que el delegado.Para obtener más información, vea Delegados (C++/CX).

3z2x4f55.collapse_all(es-es,VS.110).gifRequisitos

Opción del compilador: /ZW

Common Language Runtime

Common Language Runtime admite delegados con la sintaxis siguiente.

3z2x4f55.collapse_all(es-es,VS.110).gifSintaxis

access delegate function_declaration

3z2x4f55.collapse_all(es-es,VS.110).gifParámetros

  • access
    (opcional) La accesibilidad del delegado fuera del ensamblado puede ser pública o privada.El valor predeterminado es privado.Dentro de una clase, un delegado puede tener cualquier accesibilidad.

  • declaración de función
    La firma de la función que se puede enlazar al delegado.El tipo de valor devuelto de un delegado puede ser cualquier tipo administrado.Por razones de interoperabilidad, se recomienda que el tipo de valor devuelto de un delegado sea un tipo de CLS.

    Para definir un delegado independiente, el primer parámetro de function_declaration debe ser el tipo del puntero this para el objeto.Para obtener más información, vea Delegados independientes.

3z2x4f55.collapse_all(es-es,VS.110).gifComentarios

Los delegados son de multidifusión: "puntero de función" se puede enlazar a uno o más métodos dentro de una clase administrada.La palabra clave delegate define un tipo de delegado de multidifusión con una firma de método específica.

Un delegado también se puede enlazar a un método de una clase de valor, como un método estático.

El delegado tiene las siguientes características:

  • Hereda de System::MulticastDelegate.

  • Tiene un constructor que toma dos argumentos: un puntero a una clase administrada o NULL (en el caso del enlace a un método estático) y un método completo del tipo especificado.

  • Tiene un método llamado Invoke, cuya signatura coincide con la signatura declarada del delegado.

Cuando se invoca un delegado, las funciones se llaman en el orden en el que se adjuntaron.

El valor devuelto de un delegado es el valor devuelto de la última función de miembro adjunta.

Los delegados no se pueden sobrecargar.

Los delegados pueden enlazarse o ser independientes.

Al crear instancias de un delegado enlazado, el primer argumento será una referencia de objeto.El segundo argumento de una creación de instancia de delegado será la dirección de un método de un objeto de clase administrada o un puntero a un método de un tipo de valor.El segundo argumento de una creación de instancia del delegado debe asignar al método el nombre de la sintaxis completa de ámbito de clase y aplicar el operador address-of.

Al crear instancias de un delegado sin enlazar, el primer argumento será la dirección de un método de un objeto de clase administrada o un puntero a un método de un tipo de valor.El argumento debe llamar al método con la sintaxis completa de ámbito de clase y aplicar el operador address-of.

Al crear un delegado para una función estática o global, solo se requiere un parámetro: la función (opcionalmente, la dirección de la función).

Para obtener más información acerca de delegados, vea

3z2x4f55.collapse_all(es-es,VS.110).gifRequisitos

Opción del compilador: /clr

3z2x4f55.collapse_all(es-es,VS.110).gifEjemplos

Ejemplo

El ejemplo siguiente muestra cómo declarar, inicializar e invocar delegados.

// 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

  
  
  
  
  

Vea también

Conceptos

Extensiones de componentes para plataformas de tiempo de ejecución