Aquí podría ser tu PUBLICIDAD


¿Cuáles son las ventajas de los delegados?

votos
21

¿Cuáles son los beneficios / ventajas de usar delegados? ¿Alguien puede dar ejemplos simples?

Publicado el 12/03/2009 a las 17:04
fuente por usuario Xaisoft
En otros idiomas...        العربية       

7 respuestas

votos
42

Son una excelente forma de encapsular un fragmento de código. Por ejemplo, cuando adjunta un controlador de eventos al botón, ese controlador es un delegado. El botón no necesita saber qué hace, solo cómo llamarlo en el momento correcto.

Otro ejemplo es LINQ: filtrado, proyección, etc., todos requieren el mismo tipo de código de plantilla; todo lo que cambia es la lógica para representar el filtro, la proyección, etc. Con expresiones lambda en C # 3 (que se convierten en delegados o árboles de expresiones) esto lo hace realmente simple:

var namesOfAdults = people.Where(person => person.Age >= 18)
                          .Select(person => person.Name);

(Eso también se puede representar como una expresión de consulta, pero no nos alejemos demasiado de los delegados).

Otra forma de pensar de un delegado es como un tipo de interfaz de método único. Por ejemplo, el EventHandlertipo de delegado es un poco como:

public interface IEventHandler
{
    void Invoke(object sender, EventArgs e)
}

Pero el soporte de delegados en el marco permite que los delegados se encadenen entre sí, se invoquen de forma asíncrona, se usen como controladores de eventos, etc.

Para más información sobre delegados y eventos, vea mi artículo sobre el tema . Su enfoque son los eventos, pero también cubre a los delegados.

Respondida el 12/03/2009 a las 05:07
fuente por usuario Jon Skeet


Aquí podría ser tu PUBLICIDAD


votos
12

Este es un tema bastante vago, pero aquí hay algunas cosas a considerar:

Los delegados son básicamente un puntero de función más limpio y más fácil. Cualquier lugar donde se usaron punteros de función en C ++, puede pensar en delegar.

Ventajas de usarlos en el diseño:

  • Puede conducir a una fácil reutilización del código
  • Puede proporcionar una gran cantidad de flexibilidad en sus diseños
  • Le permiten desarrollar bibliotecas y clases que son fácilmente extensibles, ya que proporciona una manera fácil de enganchar otras funcionalidades (por ejemplo, una cláusula where en LINQ puede usar un delegado [Func<T,bool>]para filtrar, sin tener que escribir código nuevo en el método Where

Posibles desventajas:

  • Ellos ~can~, particularmente si se usan ingenuamente, conducen a un código que es más difícil de leer
  • Pueden introducir comportamientos en su componente que son inesperados, ya que se llamará al código de terceros fuera de su control (por ejemplo, si alguien conecta un delegado a uno de sus eventos que causa un bucle infinito, puede hacer que su clase se vea mal, a pesar de que no tiene nada que ver con usted)
Respondida el 12/03/2009 a las 05:14
fuente por usuario Reed Copsey

votos
5

Los delegados tienen tres propósitos:

  1. Una implementación simplificada del patrón Observer
  2. Una implementación simplificada de callbacks
  3. Bloques de código anónimos (no reutilizables)

Observador

public class Something
{
    public event EventHandler SomethingHappened;
}

public class SomethingConsumer
{
    private mySomething = new Something();

    public void WireUpEvents()
    {
        mySomething.SomethingHappened += whenSomethingHappened;
    }

    private void whenSoemthingHappened(object sender, EventArgs e)
    {
        // do something
    }
}

Llamar de vuelta

public void DoSomethingAsynchronously(EventHandler callBack)
{
    // long running logic.
    callBack(this, EventArgs.Empty);
}

Código anónimo no reutilizable

public void DoSomethingReusably(Action nonReusableCode)
{
    // reusable code
    nonReusableCode();
    // more reusable code
}

public void DoALotOfSomething()
{
    DoSomethingReusably(() => { /* non-reusable code here */ });
    DoSomethingReusably(() => { /* non-reusable code here */ });
    DoSomethingReusably(() => { /* non-reusable code here */ });
}

En todos los casos, solo se trata de proporcionar concisión.

Respondida el 12/03/2009 a las 05:14
fuente por usuario Michael Meadows

votos
2

Descargo de responsabilidad: no estoy diciendo cómo utilicé un delegado de la manera prevista, pero es un ejemplo.

Solo lo he usado una vez, pero básicamente en nuestra aplicación el usuario hace clic en un botón "Completar" para un paso que luego los lleva a una página de enrutamiento para decidir dónde enviarlo a continuación. Entonces, técnicamente, el paso que acaban de hacer clic en "Completar" no termina realmente hasta que lo encaminan. Pero como estoy en otra página, no pude acceder fácilmente a donde acababan de estar.

Entonces, lo que hice fue crear un delegado para los pocos pasos que requerían un procesamiento especial (en este caso un correo electrónico) cuando hacía clic en "Completar", y cuando lo enrutaban en la página siguiente verificaba la existencia del delegado y si estaba allí llamarlo para disparar mi evento 'almacenado'.

Creativo: probablemente, incorrecto: quizás, trabajando: definitivamente.

Como dije probablemente no como fue pensado para ser usado, pero la codificación es tanto arte como ciencia ¿verdad?

Respondida el 12/03/2009 a las 05:26
fuente por usuario Jeff Keslinke

votos
2

Ventajas en comparación con qué? Los delegados pueden ser cosas útiles, y seguramente tienen su lugar en muchos códigos C # moderadamente complejos. (Siempre que use eventos en clases, está implícitamente usando delegados de multidifusión). Si desea una introducción a su sintaxis y usos, le recomiendo los siguientes artículos:

Respondida el 12/03/2009 a las 05:10
fuente por usuario Noldorin

votos
2

El delegado en C # es eqv. para que funcione el puntero en C, pero también lleva una referencia a la instancia de la clase desde la que se creó.

Todos los controladores de eventos en Windows Forms son delegados.

Respondida el 12/03/2009 a las 05:10
fuente por usuario Joshua

votos
1

Recuerdo un framework de GUI de Java que no tenía ningún concepto de delegados o enrutamiento de comandos. Para hacer un botón que hace algo, debe subclasificar el botón y anular el método de clic. Terminaste con muchas subclases de elementos de la interfaz de usuario con pequeñas partes del código de tu aplicación.

El código que maneja ese clic tiene que ir a alguna parte, y en un lenguaje OO como Java o C # tiene que ir en una clase, pero los delegados lo permiten en un lugar conveniente. Eso a menudo lleva a tener demasiados códigos haciendo demasiadas cosas diferentes en una clase de formulario, pero ese es un problema diferente.

Respondida el 12/03/2009 a las 05:37
fuente por usuario Anthony