stringtranslate.com

Delegado (CLI)

Un delegado es una forma de puntero de función con seguridad de tipos utilizado por Common Language Infrastructure (CLI). Los delegados especifican un método para llamar y, opcionalmente, un objeto para llamar al método. Los delegados se utilizan, entre otras cosas, para implementar devoluciones de llamadas y detectores de eventos . Un objeto delegado encapsula una referencia a un método. Luego, el objeto delegado se puede pasar a un código que pueda llamar al método al que se hace referencia , sin tener que saber en el momento de la compilación qué método se invocará.

Un delegado de multidifusión es un delegado que apunta a varios métodos. [1] [2] La delegación de multidifusión es un mecanismo que proporciona funcionalidad para ejecutar más de un método. Hay una lista de delegados mantenida internamente y cuando se invoca al delegado de multidifusión, se ejecuta la lista de delegados.

En C#, los delegados se utilizan a menudo para implementar devoluciones de llamadas en programación basada en eventos. Por ejemplo, se puede utilizar un delegado para indicar qué método se debe llamar cuando el usuario hace clic en algún botón. Los delegados permiten al programador notificar a varios métodos que ha ocurrido un evento. [3]

Ejemplo de código C#

Código para declarar un delegatetipo, llamado SendMessageDelegate, que toma Messagecomo parámetro y devuelve void:

delegado nulo SendMessageDelegate ( mensaje mensaje );   

Código para definir un método que toma un delegado instanciado como argumento:

void SendMessage ( SendMessageDelegate sendMessageDelegateReference ) { // Llama al delegado y a cualquier otro delegado encadenado de forma sincrónica. sendMessageDelegateReference ( nuevo mensaje ( "hola, este es un mensaje de muestra" )); }     

El método implementado que se ejecuta cuando se llama al delegado:

void HandleSendMessage ( Mensaje de mensaje ) { // La implementación de las clases Remitente y Mensaje no es relevante para este ejemplo. Remitente . Enviar mensaje ) ; }    

Código para llamar al método SendMessage, pasando un delegado instanciado como argumento:

SendMessage ( nuevo SendMessageDelegate ( HandleSendMessage )); 

Delegados (C#)

delegado notificador nulo ( remitente de cadena ); // Firma del método normal con la palabra clave delegado    Notificador saludame ; // Delegar variable  void HowAreYou ( cadena remitente ) { Consola . WriteLine ( "¿Cómo estás " + remitente + '?' ); }        saludame = nuevo notificador ( ¿Cómo estás ?);   

Una variable delegada llama al método asociado y se llama de la siguiente manera:

saludame ( "Anton" ); // Llama a HowAreYou("Anton") e imprime "¿Cómo estás, Anton?" 

Las variables delegadas son objetos de primera clase del formulario y se pueden asignar a cualquier método de coincidencia o al valor . Almacenan un método y su receptor sin ningún parámetro: [4]new DelegateType(obj.Method)null

nuevo DelegateType ( FunnyObj . HowAreYou ); 

El objeto funnyObjpuede ser thisy omitido. Si el método es static, no debería ser el objeto (también llamado instancia en otros idiomas), sino la clase misma. No debería serlo abstract, pero podría serlo new, overrideo virtual.

Para llamar exitosamente a un método con un delegado, la firma del método debe coincidir DelegateTypecon la misma cantidad de parámetros del mismo tipo ( ref,, ) con el mismo tipo (incluido el tipo de retorno).outvalue

Delegados de multidifusión (C#)

Una variable delegada puede contener múltiples valores al mismo tiempo:

void HowAreYou ( cadena remitente ) { Consola . WriteLine ( $"¿Cómo estás, {remitente}?" ); }   void HowAreYouToday ( cadena remitente ) { Consola . WriteLine ( $"¿Cómo estás hoy, {remitente}?" ); }   Notificador saludame ; saludame = ¿Cómo estás ? saludame += ¿Cómo estás hoy ?    saludame ( "Leonardo" ); // "¿Cómo estás, Leonardo?" // "¿Cómo estás hoy, Leonardo?"  saludame -= ¿Cómo estás ?  saludame ( "Pereira" ); // "¿Cómo estás hoy, Pereira?" 

Si el delegado de multidifusión es una función o no tiene ningún outparámetro, se devuelve el parámetro de la última llamada. [5]

Detalles técnicos de implementación

Aunque las implementaciones internas pueden variar, las instancias de delegado pueden considerarse como una tupla de un objeto y un puntero de método y una referencia (posiblemente nula) a otro delegado. Por lo tanto, una referencia a un delegado es posiblemente una referencia a varios delegados. Cuando el primer delegado haya terminado, si su referencia de cadena no es nula, se invocará al siguiente, y así sucesivamente hasta completar la lista. Este patrón permite que un evento tenga una sobrecarga que se escala fácilmente desde una única referencia hasta su envío a una lista de delegados, y se usa ampliamente en la CLI.

Actuación

El rendimiento de los delegados solía ser mucho más lento que una llamada a un método virtual o de interfaz (de 6 a 8 veces más lento en los puntos de referencia de Microsoft de 2003), [6] pero, desde .NET 2.0 CLR en 2005, es aproximadamente el mismo que el de las llamadas de interfaz. [7] Esto significa que hay una pequeña sobrecarga adicional en comparación con las invocaciones directas de métodos.

Existen reglas muy estrictas sobre la construcción de clases de delegados. Estas reglas permiten a los compiladores de optimización un gran margen de maniobra al optimizar los delegados y, al mismo tiempo, garantizan la seguridad de tipos. [ cita necesaria ]

Ver también

Referencias

  1. ^ Artículo de Microsoft Developer Network (MSDN), Cómo: combinar delegados (delegados de multidifusión) (Guía de programación de C#) , consultado el 20/05/2008
  2. ^ "Acerca de los delegados" de Microsoft"". Red de desarrolladores de Sun. Microsistemas solares. Archivado desde el original el 10 de febrero de 1999.
  3. ^ Wikilibros: programación/delegados y eventos de C Sharp
  4. ^ Mössenböck, Hanspeter (25 de marzo de 2002). "C# avanzado: número variable de parámetros" (PDF) . Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. págs. 23-24 . Consultado el 4 de agosto de 2011 .
  5. ^ Mössenböck, Hanspeter (25 de marzo de 2002). "C# avanzado: número variable de parámetros". Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. pag. 25 . Consultado el 4 de agosto de 2011 .
  6. ^ Gray, enero (junio de 2003). "Escribir código administrado más rápido: saber cuánto cuestan las cosas". Microsoft . Consultado el 9 de septiembre de 2007 .
  7. ^ Sturm, Oliver (1 de septiembre de 2005). "Las llamadas de los delegados se aceleraron enormemente en .NET 2" . Consultado el 9 de septiembre de 2007 .

enlaces externos