Delegados (Guía de programación de C#)

Un delegado es un tipo que representa referencias a métodos con una lista de parámetros determinada y un tipo de valor devuelto. Cuando se crea una instancia de un delegado, puede asociar su instancia a cualquier método mediante una signatura compatible y un tipo de valor devuelto. Puede invocar (o llamar) al método a través de la instancia del delegado.

Los delegados se utilizan para pasar métodos como argumentos a otros métodos. Los controladores de eventos no son más que métodos que se invocan a través de delegados. Cree un método personalizado y una clase, como un control de Windows, podrá llamar al método cuando se produzca un determinado evento. En el siguiente ejemplo se muestra una declaración de delegado:

public delegate int PerformCalculation(int x, int y);

Cualquier método de cualquier clase o struct accesible que coincida con el tipo de delegado se puede asignar al delegado. El método puede ser estático o de instancia. Esta flexibilidad significa que puede cambiar las llamadas de método mediante programación, o bien agregar código nuevo a las clases existentes.

Nota

En el contexto de la sobrecarga de métodos, la signatura de un método no incluye el valor devuelto. Sin embargo, en el contexto de los delegados, la signatura sí lo incluye. En otras palabras, un método debe tener el mismo tipo de valor devuelto que el delegado.

Esta capacidad de hacer referencia a un método como parámetro hace que los delegados sean idóneos para definir métodos de devolución de llamada. Puede escribir un método que compare dos objetos en la aplicación. Ese método se puede usar en un delegado para un algoritmo de ordenación. Como el código de comparación es independiente de la biblioteca, el método de ordenación puede ser más general.

Se han agregado punteros de función a C# 9 para escenarios similares, donde se necesita más control sobre la convención de llamadas. El código asociado a un delegado se invoca mediante un método virtual agregado a un tipo de delegado. Mediante los punteros de función puede especificar otras convenciones.

Información general sobre los delegados

Los delegados tienen las propiedades siguientes:

  • Los delegados son similares a los punteros de función de C++, pero los primeros están completamente orientados a objetos y, a diferencia de los punteros de C++ de funciones de miembro, los delegados encapsulan una instancia de objeto y un método.
  • Los delegados permiten pasar los métodos como parámetros.
  • Los delegados pueden usarse para definir métodos de devolución de llamada.
  • Los delegados pueden encadenarse entre sí; por ejemplo, se puede llamar a varios métodos en un solo evento.
  • No es necesario que los métodos coincidan exactamente con el tipo de delegado. Para obtener más información, consulte Usar varianza en delegados.
  • Las expresiones lambda son una manera más concisa de escribir bloques de código alineado. En determinados contextos, las expresiones lambda se compilan en tipos de delegado. Para más información sobre las expresiones lambda, consulte Expresiones lambda.

En esta sección

Especificación del lenguaje C#

Para obtener más información, vea la sección Delegados de Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Consulte también