Respuestas:
Un delegado es un tipo con nombre que define un tipo particular de método. Al igual que una definición de clase establece todos los miembros para el tipo de objeto dado que define, el delegado establece la firma del método para el tipo de método que define.
Según esta declaración, un delegado es un puntero de función y define cómo se ve esa función.
Un gran ejemplo de una aplicación en el mundo real de un delegado es el Predicado . En el ejemplo del enlace, notará que Array.Find toma la matriz para buscar y luego un predicado para manejar los criterios de qué buscar. En este caso, pasa un método ProductGT10 que coincide con la firma del predicado.
Como se indica en "Aprendizaje de C # 3.0: Domine los fundamentos de C # 3.0"
Escenario general: cuando muere un jefe de estado, el presidente de los Estados Unidos normalmente no tiene tiempo para asistir personalmente al funeral. En cambio, envía un delegado. A menudo, este delegado es el vicepresidente, pero a veces el vicepresidente no está disponible y el presidente debe enviar a otra persona, como el secretario de Estado o incluso la primera dama. No quiere "cablear" su autoridad delegada a una sola persona; podría delegar esta responsabilidad en cualquiera que sea capaz de ejecutar el protocolo internacional correcto.
El presidente define de antemano qué responsabilidad se delegará (asistir al funeral), qué parámetros se pasarán (condolencias, palabras amables) y qué valor espera recuperar (buena voluntad). Luego, asigna a una persona en particular a esa responsabilidad delegada en el "tiempo de ejecución" a medida que avanza el curso de su presidencia.
En el escenario de programación: a menudo se enfrenta a situaciones en las que necesita ejecutar una acción en particular, pero no sabe de antemano qué método, o incluso qué objeto, querrá llamar para ejecutarlo.
Por ejemplo: es posible que un botón no sepa qué objeto u objetos deben notificarse. En lugar de conectar el botón a un objeto en particular, conectará el botón a un delegado y luego resolverá ese delegado con un método en particular cuando se ejecute el programa.
Un uso común de los delegados para las listas genéricas es a través de delegados de acción (o su equivalente anónimo) para crear una operación de una línea para cada operación:
myList.Foreach( i => i.DoSomething());
También encuentro que el delegado de predicado es bastante útil para buscar o podar una lista:
myList.FindAll( i => i.Name == "Bob");
myList.RemoveAll( i => i.Name == "Bob");
Sé que dijiste que no se requiere código, pero me resulta más fácil expresar su utilidad a través del código. :)
Si está interesado en ver cómo se usa el patrón Delegate en el código del mundo real, no busque más, Cocoa en Mac OS X. Cocoa es el kit de herramientas de IU preferido de Apple para programar en Mac OS X, y está codificado en Objective C. diseñado para que cada componente de la interfaz de usuario se extienda mediante delegación en lugar de subclases u otros medios.
Para obtener más información, recomiendo consultar lo que Apple tiene que decir sobre los delegados aquí .
Tenía un proyecto que usaba win32 Python.
Debido a varias razones, algunos módulos usaron odbc.py para acceder a la base de datos y otros módulos, pyodbc.py.
Había un problema cuando una función debía ser utilizada por ambos tipos de módulos. Se le pasó un objeto de conexión como argumento, pero luego tuvo que saber si usar dbi.dbiDate o datetime para representar las horas.
Esto se debió a que odbc.py esperaba, como valores en declaraciones SQL, fechas como dbi.dbiDate mientras que pyodbc.py esperaba valores de fecha y hora.
Una complicación adicional fue que los objetos de conexión creados por odbc.py y pyodbc.py no permitían establecer campos adicionales.
Mi solución fue envolver los objetos de conexión devueltos por odbc.odbc (...) y pyodbc.pyodbc (...) por una clase delegada, que contiene la función de representación de tiempo deseada como el valor de un campo adicional, y que delega todas las demás solicitudes de campo al objeto de conexión original.
Tenía la misma pregunta que tú y fui a este sitio en busca de una respuesta.
Aparentemente, no lo entendí mejor a pesar de que hojeé los ejemplos de este hilo.
Encontré un gran uso para los delegados ahora que leí: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx
Esto puede parecer más obvio para los nuevos usuarios porque Forms es mucho más complicado para pasar valores que los sitios web ASP.NET con POST / GET (QueryString).
Básicamente, usted define un delegado que toma "TextBox text " como parámetros.
// Formulario 1
// Class Property Definition
public delegate void delPassData(TextBox text);
// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
Form2 frm= new Form2();
delPassData del=new delPassData(frm.funData);
del(this.textBox1);
frm.Show();
}
// RESUMEN: Defina delegado, cree una nueva clase Form2, asigne la función funData () para delegar, pase su textBox al delegado. Muestre el formulario.
// Form2
public void passData(TextBox txtForm1)
{
label1.Text = txtForm1.Text;
}
// RESUMEN: Simplemente tome TextBox txtForm1 como parámetros (como se define en su delegado) y asigne el texto de la etiqueta al texto de textBox.
Espero que esto aclare algún uso a los delegados :) ..
Una búsqueda rápida en Google dio como resultado este http://en.wikipedia.org/wiki/Delegation_pattern . Básicamente, cada vez que usa un objeto que reenvía sus llamadas a otro objeto, entonces está delegando.