En C#, un delegado es similar a la función de un puntero en C o C++. El uso de un delegado te permite encapsular una referencia a un método dentro de un objeto. El objeto delegado se puede pasar entonces al código, al cual puedes nombrar método de referencia, sin tener que conocer en tiempo de compilación qué método se debe utilizar.

A diferencia de los punteros a función de C o C++, los delegados están orientados a objetos, son seguros y proporcionan seguridad de tipos.

Una propiedad interesante y útil de un delegado es que no necesita conocer la clase del objeto al que hace referencia. Cualquier objeto es adecuado; lo único que importa es que los tipos de los argumentos del método y el tipo devuelto coincidan con los del delegado. Esto hace que los delegados sean perfectos para una invocación “anónima”.

*Los delegados se ejecutan bajo los permisos de seguridad de los llamadores, no de los declaradores.

Una propiedad útil de los objetos delegados es que se pueden componer mediante el operador “+“. Un delegado compuesto llama a los dos delegados de los que se compone. Solo pueden ser compuestos los delegados del mismo tipo.

El operador “” se puede utilizar para quitar un delegado componente de un delegado compuesto.

En el siguiente ejemplo podrás aprender cómo componer delegados en Visual Studio .NET 2003:

<alt>cómo-componer-delegados</alt>

Resultado

<alt>cómo-componer-delegados</alt>

Delegados frente a interfaces

Los delegados e interfaces son similares en el sentido en que ambos permiten la separación entre especificación e implementación. Se pueden crear implementaciones compatibles con una especificación de interfaz. De forma similar, un delegado especifica la firma de un método, y los programadores pueden escribir métodos compatibles con la especificación del delegado. ¿Cuándo se deben utilizar interfaces y cuándo delegados?

Los delegados son útiles cuando:

  • Se llama a un único método.
  • Una clase necesita varias implementaciones de la especificación del método.
  • Es deseable permitir el uso de un método estático para implementar la especificación.
  • Se desea utilizar un modelo de diseño similar al de los eventos
  • El código que realiza la llamada no necesita conocer u obtener el objeto sobre el que el método está definido.
  • El proveedor de la implementación desea “distribuir” la implementación de la especificación sólo a unos pocos componentes seleccionados.
  • Se desea conseguir una composición fácil.

Las interfaces son útiles cuando:

  • La especificación define un conjunto de métodos relacionados a los que se llamará.
  • Una clase normalmente implementa la especificación sólo una vez.
  • El código que realiza la llamada a la interfaz necesita convertir hacia o desde el tipo de la interfaz para obtener otras interfaces o clases.

Quiero estudiar Ingeniería en línea en Sistemas Computacionales

Referencias:

Deitel, H., Deitel, P., Vidal Romero Elizondo, A., & Cruz Castillo, L. (2007). Cómo programar en C# (2nd ed., pp. 305-339). México: Pearson Educación.

Aprender a desarrollar con Microsoft Developer Network | MSDN. (2017). Msdn.microsoft.com. Retrieved 27 April 2017, from https://msdn.microsoft.com/es-mx