ventajas son sobre sharp otros net lenguajes lenguaje las frente desventajas desarrollar cuáles curva caracteristicas aprendizaje c# .net delegates

son - ventajas de desarrollar en c#



¿Cuáles son las ventajas de los delegados? (7)

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

Esta pregunta ya tiene una respuesta aquí:

¿Cuáles son los beneficios / ventajas de usar delegados? ¿Puede alguien proporcionar ejemplos simples?


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

Todos los controladores de eventos en Windows Forms son delegados.


Descargo de responsabilidad: no estoy diciendo que use un delegado es la forma prevista, pero es un ejemplo.

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

Entonces, lo que hice fue crear un delegado para los pocos pasos que requirieron un procesamiento especial (en este caso, un correo electrónico) cuando se hizo clic en ''Completo'', y cuando se enrutaron en la página siguiente, verificaría la existencia del delegado y fue allí llamarlo para disparar mi evento ''almacenado''.

Creativo: probablemente, mal: tal vez, trabajando: definitivamente.

Como dije, probablemente no se trate de su uso, pero la codificación es tanto arte como ciencia, ¿no?


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 fácil. En cualquier lugar donde se usen los punteros de función en C ++, puede pensar delegado.

Ventajas de utilizarlos en diseño:

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

Posibles desventajas:

  • Ellos ~can~ , especialmente si se usan ingenuamente, conducen a un código que es más difícil de leer
  • Pueden introducir un comportamiento en su componente que es inesperado, ya que se llamará a un código de terceros fuera de su control (por ejemplo, si alguien adjunta un delegado a uno de sus eventos que causa un bucle infinito, puede hacer que su clase se vea mal aunque no tenga nada que ver contigo)

Los delegados sirven tres propósitos:

  1. Una implementación simplificada del patrón Observer.
  2. Una implementación simplificada de devoluciones de llamada
  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, es solo una cuestión de proporcionar concisión.


Recuerdo un primer marco de GUI de Java que no tenía ningún concepto de delegados o enrutamiento de comandos. Para hacer un botón que haga algo, tuvo que hacer una subclase de Botón y anular el método de clic. Terminó con muchas y muchas subclases de elementos de la interfaz de usuario con pequeños fragmentos del código de su aplicación.

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


Son una gran manera de encapsular un pedazo 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, simplemente cómo llamarlo en el momento adecuado.

Otro ejemplo es LINQ: el filtrado, la proyección, etc. 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 las expresiones lambda en C # 3 (que se convierten en delegados o árboles de expresión) esto lo hace realmente simple:

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

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

Otra forma de pensar en un delegado es como un tipo de interfaz de un solo método. Por ejemplo, el tipo de delegado EventHandler es un poco como:

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

Pero el soporte de delegado en el marco permite a los delegados ser encadenados, invocados de forma asíncrona, utilizados 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.