AYUDA .NET

C# Delegates (Cómo funciona para los desarrolladores)

Actualizado 18 de febrero, 2024
Compartir:

En la programación en C#, la comprensión de los delegados es de suma importancia para escribir código flexible y extensible. Los delegados sirven como poderosas entidades que facilitan la implementación de callbacks, manejo de eventos y paradigmas de programación funcional dentro del lenguaje. Microsoft proporciona una guía completa sobre las instancias delegadas que se utilizan en las aplicaciones C#.

En esta completa guía, profundizaremos en las complejidades de los delegados de C#, explorando su funcionalidad, casos de uso y cómo permiten a los desarrolladores escribir código más modular y escalable.

Entendiendo C# Delegados: La columna vertebral de las devoluciones de llamada

En esencia, un delegado en C# es un objeto de tipo seguro también conocido como puntero de función que encapsula un método o más de un método. Los delegados permiten la creación de referencias a funciones, proporcionando un medio para pasar métodos como parámetros, almacenarlos en estructuras de datos e invocarlos dinámicamente. Esto convierte a los delegados en la piedra angular para conseguir mecanismos de devolución de llamada e implementar arquitecturas basadas en eventos.

Características principales de C# Delegados

  1. Seguridad de tipo: Los delegados son seguros de tipo, asegurando que la firma del método al que hacen referencia se alinea con la firma del delegado.
  2. Multidifusión: Los delegados admiten la invocación multidifusión, lo que permite combinar varios métodos en una única instancia de delegado. Cuando se invocan, todos los métodos del delegado de multidifusión se llaman secuencialmente.
  3. Métodos anónimos y expresiones lambda: Los delegados de C# se integran a la perfección con métodos anónimos y expresiones lambda, proporcionando una sintaxis concisa para definir cuerpos de métodos en línea.

Uso básico y sintaxis

Los pasos fundamentales para utilizar delegados implican la declaración con el tipo de delegado y los parámetros, la instanciación y la invocación mediante la definición de métodos de devolución de llamada. He aquí un ejemplo básico:

//  Declaración del delegado
public delegate void MyDelegate(string message);
//  Instanciación
MyDelegate myDelegate = DisplayMessage;
//  Método de referencia
static void DisplayMessage(string message)
{
    Console.WriteLine(message);
}
//  Invocación
myDelegate("Hello, Delegates!");
//  Declaración del delegado
public delegate void MyDelegate(string message);
//  Instanciación
MyDelegate myDelegate = DisplayMessage;
//  Método de referencia
static void DisplayMessage(string message)
{
    Console.WriteLine(message);
}
//  Invocación
myDelegate("Hello, Delegates!");
'  Declaración del delegado
Public Delegate Sub MyDelegate(ByVal message As String)
'  Instanciación
Private myDelegate As MyDelegate = AddressOf DisplayMessage
'  Método de referencia
Shared Sub DisplayMessage(ByVal message As String)
	Console.WriteLine(message)
End Sub
'  Invocación
myDelegate("Hello, Delegates!")
VB   C#

Escenarios de devolución de llamada: Aprovechar la flexibilidad de los delegados

Uno de los principales casos de uso de los delegados es la implementación de callbacks. Considere escenarios donde un método necesita notificar a un componente externo cuando ocurre un evento específico. Los delegados ofrecen una solución limpia y modular:

class Program
{
static void Main(string [] args)
{
   public class EventPublisher
   {
       //  Declarar un delegado
       public delegate void EventHandler(string eventName);
       //  Crear una instancia del delegado
       public EventHandler EventOccurred;
       //  Simular un acontecimiento
       public void SimulateEvent(string eventName)
       {
           //  Invocar al delegado para notificar a los abonados
           EventOccurred?.Invoke(eventName);
       }
   }
   public class EventSubscriber
   {
       public EventSubscriber(EventPublisher eventPublisher)
       {
           //  Suscribirse al evento utilizando el delegado
           eventPublisher.EventOccurred += HandleEvent;
       }
       //  Método que se invocará cuando se produzca el evento
       private void HandleEvent(string eventName)
       {
           Console.WriteLine($"Event handled: {eventName}");
       }
   }
}
}
class Program
{
static void Main(string [] args)
{
   public class EventPublisher
   {
       //  Declarar un delegado
       public delegate void EventHandler(string eventName);
       //  Crear una instancia del delegado
       public EventHandler EventOccurred;
       //  Simular un acontecimiento
       public void SimulateEvent(string eventName)
       {
           //  Invocar al delegado para notificar a los abonados
           EventOccurred?.Invoke(eventName);
       }
   }
   public class EventSubscriber
   {
       public EventSubscriber(EventPublisher eventPublisher)
       {
           //  Suscribirse al evento utilizando el delegado
           eventPublisher.EventOccurred += HandleEvent;
       }
       //  Método que se invocará cuando se produzca el evento
       private void HandleEvent(string eventName)
       {
           Console.WriteLine($"Event handled: {eventName}");
       }
   }
}
}
Friend Class Program
Shared Sub Main(ByVal args() As String)
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'   public class EventPublisher
'   {
'	   '  Declarar un delegado
'	   public delegate void EventHandler(string eventName);
'	   '  Crear una instancia del delegado
'	   public EventHandler EventOccurred;
'	   '  Simular un acontecimiento
'	   public void SimulateEvent(string eventName)
'	   {
'		   '  Invocar al delegado para notificar a los abonados
'		   if (EventOccurred != Nothing)
'			   EventOccurred.Invoke(eventName);
'	   }
'   }
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'   public class EventSubscriber
'   {
'	   public EventSubscriber(EventPublisher eventPublisher)
'	   {
'		   '  Suscribirse al evento utilizando el delegado
'		   eventPublisher.EventOccurred += HandleEvent;
'	   }
'	   '  Método que se invocará cuando se produzca el evento
'	   private void HandleEvent(string eventName)
'	   {
'		   Console.WriteLine(string.Format("Event handled: {0}", eventName));
'	   }
'   }
End Sub
End Class
VB   C#

Programación funcional con delegados

Los delegados desempeñan un papel crucial en la adopción de conceptos de programación funcional en C#. Utilizando delegados con funciones de orden superior, los desarrolladores pueden pasar funciones como argumentos, devolver funciones y crear código más expresivo y conciso:

public delegate int MyDelegate(int x, int y);
public class Calculator
{
    public int PerformOperation(MyDelegate operation, int operand1, int operand2)
    {
        return operation(operand1, operand2);
    }
}
//  Utilización
var calculator = new Calculator();
int result = calculator.PerformOperation((x, y) => x + y, 5, 3); //  Añade 5 y 3
public delegate int MyDelegate(int x, int y);
public class Calculator
{
    public int PerformOperation(MyDelegate operation, int operand1, int operand2)
    {
        return operation(operand1, operand2);
    }
}
//  Utilización
var calculator = new Calculator();
int result = calculator.PerformOperation((x, y) => x + y, 5, 3); //  Añade 5 y 3
Public Delegate Function MyDelegate(ByVal x As Integer, ByVal y As Integer) As Integer
Public Class Calculator
	Public Function PerformOperation(ByVal operation As MyDelegate, ByVal operand1 As Integer, ByVal operand2 As Integer) As Integer
		Return operation(operand1, operand2)
	End Function
End Class
'  Utilización
Private calculator = New Calculator()
Private result As Integer = calculator.PerformOperation(Function(x, y) x + y, 5, 3) '  Añade 5 y 3
VB   C#

Presentación de IronPDF: Un breve resumen

Delegados C (Cómo funciona para los desarrolladores): Figura 1 - Página web de IronPDF

IronPDF es una biblioteca repleta de funciones diseñada para facilitar la generación, manipulación e interacción con PDF en aplicaciones C#. Tanto si necesita crear PDF desde cero, convertir HTML a PDF o extraer contenido de PDF existentes, IronPDF le ofrece un completo conjunto de herramientas para agilizar estas tareas. Su versatilidad lo convierte en un activo valioso para los desarrolladores que trabajan en proyectos muy diversos.

Instalación de IronPDF: Inicio rápido

Para empezar a aprovechar la biblioteca IronPDF en su proyecto C#, puede instalar fácilmente el paquete IronPDF NuGet. Utilice el siguiente comando en la consola del gestor de paquetes:

Install-Package IronPdf

También puede buscar "IronPDF" en el gestor de paquetes NuGet e instalarlo desde allí.

Delegados C# (Cómo funciona para los desarrolladores): Figura 2 - Instalación de la librería IronPDF a través de NuGet Package Manager

Delegados en C#: Un breve resumen

En C#, los delegados sirven como punteros a funciones seguras, permitiendo que los métodos sean referenciados y pasados como parámetros. Los delegados desempeñan un papel crucial en los distintos escenarios mencionados. Ahora, surge la pregunta: ¿Cómo encajan los delegados de C# en el entorno de IronPDF, y pueden utilizarse eficazmente en tándem?

Integración de delegados con IronPDF

1. Uso de métodos de devolución de llamada para eventos de documento

Una forma de aprovechar los delegados con IronPDF es a través de llamadas de retorno para eventos de documentos. IronPDF proporciona eventos a los que puede suscribirse utilizando delegados, lo que le permite ejecutar lógica personalizada en puntos específicos durante el proceso de generación de documentos. Por ejemplo:

string AddPassword(PdfDocument document)
{
    string password = "";
    if (document.Password == "")
    {
        password = "Iron123";   
    }
    return password;
}
PdfDocument document = new PdfDocument("StyledDocument.pdf");
AddPasswordEventHandler handler = AddPassword;
document.Password = handler.Invoke(document);  //  Suscríbase al evento
document.SaveAs("PasswordProtected.pdf");
public delegate string AddPasswordEventHandler(PdfDocument e);
string AddPassword(PdfDocument document)
{
    string password = "";
    if (document.Password == "")
    {
        password = "Iron123";   
    }
    return password;
}
PdfDocument document = new PdfDocument("StyledDocument.pdf");
AddPasswordEventHandler handler = AddPassword;
document.Password = handler.Invoke(document);  //  Suscríbase al evento
document.SaveAs("PasswordProtected.pdf");
public delegate string AddPasswordEventHandler(PdfDocument e);
Private Function AddPassword(ByVal document As PdfDocument) As String
	Dim password As String = ""
	If document.Password = "" Then
		password = "Iron123"
	End If
	Return password
End Function
Private document As New PdfDocument("StyledDocument.pdf")
Private handler As AddPasswordEventHandler = AddressOf AddPassword
document.Password = handler.Invoke(document) '  Suscríbase al evento
document.SaveAs("PasswordProtected.pdf")
public delegate String AddPasswordEventHandler(PdfDocument e)
VB   C#

En este fragmento de código C#, se define un método llamado AddPassword que acepta un PdfDocument como parámetro y devuelve una cadena. Dentro de este método, se inicializa una variable de cadena llamada password, y se realiza una comprobación condicional de la propiedad Password del PdfDocument proporcionado. Si la contraseña es una cadena vacía, asigna el valor "Iron123" a la variable password, y la devuelve.

A continuación, se crea una instancia PdfDocument con el nombre de archivo "StyledDocument.pdf". Se declara un delegado llamado AddPasswordEventHandler con la misma firma que el método AddPassword. A una instancia de este delegado, llamada handler, se le asigna el método AddPassword. El delegado se invoca con el método Invoke, pasando la instancia document, y la contraseña devuelta se asigna a la propiedad Password del document.

Por último, se llama al método SaveAs en el document, guardándolo como "PasswordProtected.pdf". El código utiliza efectivamente un delegado para determinar dinámicamente y establecer una contraseña para un PdfDocument basado en ciertas condiciones dentro del método AddPassword.

2. Uso de delegados para contenido dinámico

Los delegados también pueden emplearse para inyectar contenido dinámico en el documento PDF. IronPDF admite la inserción de contenido HTML para crear PDF y los desarrolladores pueden utilizar delegados para generar HTML de forma dinámica basándose en determinadas condiciones o datos:

//  Asumiendo que GetDynamicContent es un delegado que genera contenido HTML dinámico
Func<string> getDynamicContent = () =>
{
    //  Lógica personalizada para generar contenidos dinámicos
    return "<p>This is dynamic content based on some condition.</p>";
};
//  Incorporar HTML dinámico al PDF
var pdfDocument = new ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf($"<html><body>{getDynamicContent()}</body></html>").SaveAs("DynamicContentDocument.pdf");
//  Asumiendo que GetDynamicContent es un delegado que genera contenido HTML dinámico
Func<string> getDynamicContent = () =>
{
    //  Lógica personalizada para generar contenidos dinámicos
    return "<p>This is dynamic content based on some condition.</p>";
};
//  Incorporar HTML dinámico al PDF
var pdfDocument = new ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf($"<html><body>{getDynamicContent()}</body></html>").SaveAs("DynamicContentDocument.pdf");
'  Asumiendo que GetDynamicContent es un delegado que genera contenido HTML dinámico
Dim getDynamicContent As Func(Of String) = Function()
	'  Lógica personalizada para generar contenidos dinámicos
	Return "<p>This is dynamic content based on some condition.</p>"
End Function
'  Incorporar HTML dinámico al PDF
Dim pdfDocument = New ChromePdfRenderer()
pdfDocument.RenderHtmlAsPdf($"<html><body>{getDynamicContent()}</body></html>").SaveAs("DynamicContentDocument.pdf")
VB   C#

En este ejemplo, el delegado getDynamicContent genera contenido HTML de forma dinámica, que luego se incrusta en el documento PDF.

Delegados C (Cómo funciona para los desarrolladores): Figura 3 - PDF resultante del código anterior

Para utilizar IronPDF de forma eficiente y eficaz, visite la página documentación página.

Conclusión

En conclusión, los delegados de C# son la piedra angular de la flexibilidad y modularidad del código. Permiten a los desarrolladores implementar retrollamadas, gestionar eventos y adoptar paradigmas de programación funcional, como la posibilidad de modificar mediante programación las llamadas a métodos. Como herramienta versátil del conjunto de herramientas de C#, los delegados permiten a los desarrolladores crear código más fácil de mantener, escalable y expresivo. Tanto si está creando aplicaciones basadas en eventos, implementando mecanismos de devolución de llamada o explorando la programación funcional, los delegados de C# son un poderoso aliado en su viaje por la programación.

Los delegados de C# y IronPDF pueden formar un dúo cooperativo, mejorando las capacidades de generación de documentos en sus aplicaciones. Tanto si está personalizando eventos de documentos o inyectando contenido dinámico, los delegados proporcionan un mecanismo flexible para ampliar la funcionalidad de IronPDF. Mientras explora las posibilidades, considere los requisitos específicos de su proyecto y cómo pueden contribuir los delegados a un proceso de generación de PDF más personalizado y dinámico con IronPDF.

IronPDF ofrece un **Prueba gratuita para probar todas sus funciones. Puede ser licencia para uso comercial a partir de $749.

< ANTERIOR
Atributos de C# (Cómo funciona para desarrolladores)
SIGUIENTE >
Operador ternario de C# (Cómo funciona para desarrolladores)

¿Listo para empezar? Versión: 2024.7 recién publicada

Descarga gratuita de NuGet Descargas totales: 9,974,197 Ver licencias >
123