¿Dónde utilizo delegados? [cerrado]

109

¿Cuáles son algunos lugares del mundo real que requieren delegados? Tengo curiosidad por saber qué situaciones o patrones están presentes en los que este método es la mejor solución. No se requiere código.

slipsec
fuente

Respuestas:

33

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.

Dale Ragan
fuente
154

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.

Atish Dipongkor - MVP
fuente
1
Entonces, ¿por qué no usar simplemente funciones / lambdas anónimas?
Pacerier
5
@Pacerier Esta es una respuesta tardía y es posible que haya descubierto la respuesta, pero por el bien de otros lectores que encuentran esto: una función anónima es un tipo de delegado.
Anthony
10
@ Anthony + Pacerier: Un método anónimo NO es un delegado. Un método anónimo es un fragmento de código. Un delegado es un puntero que apunta a ese fragmento de código. No puede tener un método anónimo sin que un delegado lo señale, de lo contrario nunca se llamaría. Una lambda es un operador que se utiliza para construir expresiones lambda. Las expresiones lambda resultan principalmente en métodos anónimos que serán señalados por ... un delegado.
Martin Mulder
Tonto de mí, pero simplemente crearía una declaración If ElseIf si no supiera el uso cuando se presionó el botón. Yo dije tonto.
JustJohn
El método anónimo @Pacerier introducido en C # 2.0 y Lambda introducido en C # 3.0 si Lambda se introdujo primero, ¡nunca habría habido métodos anónimos e incluso delegados!
AminM
18

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. :)

Jon Limjap
fuente
13

La vinculación de eventos a controladores de eventos suele ser su primera introducción a los delegados ... Es posible que ni siquiera sepa que los estaba usando porque el delegado está envuelto en la clase EventHandler.

FlySwat
fuente
5

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í .

avalancha
fuente
5

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.

Omer Zak
fuente
5

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 :) ..

dezza
fuente
El método de la clase Form2 debe llamarse funData (en lugar de passData) o la asignación de función de Form1 debe llamarse frm.passData (en lugar de frm.funData).
Ethan