Ir para o conteúdo do rodapé
AJUDA DO .NET

Delegados em C# (Como funciona para desenvolvedores)

Na programação em C#, compreender os delegates é de extrema importância para escrever código flexível e extensível. Os delegates atuam como entidades poderosas que facilitam a implementação de callbacks, tratamento de eventos e paradigmas de programação funcional dentro da linguagem. O guia da Microsoft sobre delegates fornece uma visão geral abrangente das instâncias de delegate a serem usadas em aplicativos C#.

Neste guia completo, vamos explorar a fundo as complexidades dos delegates em C#, analisando sua funcionalidade, casos de uso e como eles permitem que os desenvolvedores escrevam código mais modular e escalável.

Entendendo os Delegados em C#: A Base dos Callbacks

Em sua essência, um delegate em C# é um objeto com tipagem estática, também conhecido como ponteiro de função, que encapsula um método ou mais de um método. Os delegates permitem a criação de referências a funções, fornecendo um meio de passar métodos como parâmetros, armazená-los em estruturas de dados e invocá-los dinamicamente. Isso faz dos delegados uma peça fundamental para alcançar mecanismos de retorno de chamada e implementar arquiteturas orientadas a eventos.

Principais características dos delegates em C

  1. Segurança de Tipos: Os delegados são seguros em relação aos tipos, garantindo que a assinatura do método à qual fazem referência esteja alinhada com a assinatura do delegado.
  2. Multicast: Os delegates suportam invocação multicast, permitindo que vários métodos sejam combinados em uma única instância de delegate. Quando invocado, todos os métodos no delegado multicast são chamados sequencialmente.
  3. Métodos anônimos e expressões lambda: os delegates do C# se integram perfeitamente com métodos anônimos e expressões lambda, fornecendo uma sintaxe concisa para definir corpos de métodos diretamente no código.

Uso básico e sintaxe

Os passos fundamentais para usar delegates envolvem a declaração com o tipo e os parâmetros do delegate, a instanciação e a invocação através da definição de métodos de retorno de chamada (callbacks). Eis um exemplo básico:

// Delegate declaration
public delegate void MyDelegate(string message);

class Program
{
    static void Main(string[] args)
    {
        // Instantiation
        MyDelegate myDelegate = DisplayMessage;

        // Invocation
        myDelegate("Hello, Delegates!");
    }

    // Method to be referenced
    static void DisplayMessage(string message)
    {
        Console.WriteLine(message);
    }
}
// Delegate declaration
public delegate void MyDelegate(string message);

class Program
{
    static void Main(string[] args)
    {
        // Instantiation
        MyDelegate myDelegate = DisplayMessage;

        // Invocation
        myDelegate("Hello, Delegates!");
    }

    // Method to be referenced
    static void DisplayMessage(string message)
    {
        Console.WriteLine(message);
    }
}
' Delegate declaration
Public Delegate Sub MyDelegate(ByVal message As String)

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Instantiation
		Dim myDelegate As MyDelegate = AddressOf DisplayMessage

		' Invocation
		myDelegate("Hello, Delegates!")
	End Sub

	' Method to be referenced
	Private Shared Sub DisplayMessage(ByVal message As String)
		Console.WriteLine(message)
	End Sub
End Class
$vbLabelText   $csharpLabel

Cenários de retorno de chamada: aproveitando os delegados para obter flexibilidade

Um dos principais casos de uso para delegates é a implementação de callbacks. Considere cenários em que um método precisa notificar um componente externo quando um evento específico ocorre. Os delegados oferecem uma solução limpa e modular:

using System;

class Program
{
    static void Main(string[] args)
    {
        EventPublisher publisher = new EventPublisher();
        EventSubscriber subscriber = new EventSubscriber(publisher);

        publisher.SimulateEvent("Test Event");
    }
}

public class EventPublisher
{
    // Declare a delegate type
    public delegate void EventHandler(string eventName);

    // Create an instance of the delegate
    public event EventHandler EventOccurred;

    // Simulate an event
    public void SimulateEvent(string eventName)
    {
        // Invoke the delegate to notify subscribers
        EventOccurred?.Invoke(eventName);
    }
}

public class EventSubscriber
{
    public EventSubscriber(EventPublisher eventPublisher)
    {
        // Subscribe to the event using the delegate
        eventPublisher.EventOccurred += HandleEvent;
    }

    // Method to be invoked when the event occurs
    private void HandleEvent(string eventName)
    {
        Console.WriteLine($"Event handled: {eventName}");
    }
}
using System;

class Program
{
    static void Main(string[] args)
    {
        EventPublisher publisher = new EventPublisher();
        EventSubscriber subscriber = new EventSubscriber(publisher);

        publisher.SimulateEvent("Test Event");
    }
}

public class EventPublisher
{
    // Declare a delegate type
    public delegate void EventHandler(string eventName);

    // Create an instance of the delegate
    public event EventHandler EventOccurred;

    // Simulate an event
    public void SimulateEvent(string eventName)
    {
        // Invoke the delegate to notify subscribers
        EventOccurred?.Invoke(eventName);
    }
}

public class EventSubscriber
{
    public EventSubscriber(EventPublisher eventPublisher)
    {
        // Subscribe to the event using the delegate
        eventPublisher.EventOccurred += HandleEvent;
    }

    // Method to be invoked when the event occurs
    private void HandleEvent(string eventName)
    {
        Console.WriteLine($"Event handled: {eventName}");
    }
}
Imports System

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim publisher As New EventPublisher()
		Dim subscriber As New EventSubscriber(publisher)

		publisher.SimulateEvent("Test Event")
	End Sub
End Class

Public Class EventPublisher
	' Declare a delegate type
	Public Delegate Sub EventHandler(ByVal eventName As String)

	' Create an instance of the delegate
	Public Event EventOccurred As EventHandler

	' Simulate an event
	Public Sub SimulateEvent(ByVal eventName As String)
		' Invoke the delegate to notify subscribers
		RaiseEvent EventOccurred(eventName)
	End Sub
End Class

Public Class EventSubscriber
	Public Sub New(ByVal eventPublisher As EventPublisher)
		' Subscribe to the event using the delegate
		AddHandler eventPublisher.EventOccurred, AddressOf HandleEvent
	End Sub

	' Method to be invoked when the event occurs
	Private Sub HandleEvent(ByVal eventName As String)
		Console.WriteLine($"Event handled: {eventName}")
	End Sub
End Class
$vbLabelText   $csharpLabel

Programação Funcional com Delegados

Os delegados desempenham um papel crucial na adoção de conceitos de programação funcional em C#. Ao usar delegates com funções de ordem superior, os desenvolvedores podem passar funções como argumentos, retornar funções e criar um código mais expressivo e conciso:

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

public class Calculator
{
    public int PerformOperation(MyDelegate operation, int operand1, int operand2)
    {
        // Execute the operation method reference through the passed delegate
        return operation(operand1, operand2);
    }
}

// Usage
var calculator = new Calculator();
int result = calculator.PerformOperation((x, y) => x + y, 5, 3); // Adds 5 and 3
Console.WriteLine(result); // Outputs: 8
public delegate int MyDelegate(int x, int y);

public class Calculator
{
    public int PerformOperation(MyDelegate operation, int operand1, int operand2)
    {
        // Execute the operation method reference through the passed delegate
        return operation(operand1, operand2);
    }
}

// Usage
var calculator = new Calculator();
int result = calculator.PerformOperation((x, y) => x + y, 5, 3); // Adds 5 and 3
Console.WriteLine(result); // Outputs: 8
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
		' Execute the operation method reference through the passed delegate
		Return operation(operand1, operand2)
	End Function
End Class

' Usage
Private calculator = New Calculator()
Private result As Integer = calculator.PerformOperation(Function(x, y) x + y, 5, 3) ' Adds 5 and 3
Console.WriteLine(result) ' Outputs: 8
$vbLabelText   $csharpLabel

Apresentando o IronPDF: Uma breve visão geral

Delegados C# (Como funciona para desenvolvedores): Figura 1 - Página web do IronPDF

Saiba mais sobre os recursos do IronPDF, uma biblioteca rica em funcionalidades projetada para facilitar a geração, manipulação e interação com PDFs em aplicações C#. Seja para criar PDFs do zero, converter HTML em PDF ou extrair conteúdo de PDFs existentes, o IronPDF oferece um conjunto abrangente de ferramentas para agilizar essas tarefas. Sua versatilidade o torna um recurso valioso para desenvolvedores que trabalham em uma ampla gama de projetos.

Instalando o IronPDF: Um Guia Rápido

Para começar a usar a biblioteca IronPDF em seu projeto C#, você pode instalar facilmente o pacote NuGet IronPDF . Utilize o seguinte comando no console do seu gerenciador de pacotes:

Install-Package IronPdf

Alternativamente, você pode pesquisar por "IronPDF" no Gerenciador de Pacotes NuGet e instalá-lo a partir de lá.

Delegados C# (Como funciona para desenvolvedores): Figura 2 - Instalando a biblioteca IronPDF através do Gerenciador de Pacotes NuGet

Delegados em C#: Uma breve recapitulação

Em C#, os delegates funcionam como ponteiros de função com segurança de tipos, permitindo que os métodos sejam referenciados e passados ​​como parâmetros. Os delegados desempenham um papel crucial em diferentes cenários, conforme mencionado acima. Agora, surge a questão: como os delegates em C# se encaixam no ambiente do IronPDF e podem ser utilizados em conjunto de forma eficaz?

Integração de Delegados com o IronPDF

1. Utilizando métodos de retorno de chamada para eventos de documento

Uma forma de aproveitar os recursos de delegados com o IronPDF é por meio de retornos de chamada para eventos de documento. O IronPDF oferece eventos aos quais você pode se inscrever usando delegados, permitindo que você execute lógica personalizada em pontos específicos durante o processo de geração de documentos. Por exemplo:

using IronPdf;

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); // Subscribe to the event
document.SaveAs("PasswordProtected.pdf");
using IronPdf;

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); // Subscribe to the event
document.SaveAs("PasswordProtected.pdf");
Imports IronPdf

Public Delegate Function AddPasswordEventHandler(ByVal e As PdfDocument) As String

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) ' Subscribe to the event
document.SaveAs("PasswordProtected.pdf")
$vbLabelText   $csharpLabel

Neste trecho de código C#, um método chamado AddPassword é definido para aceitar um PdfDocument como parâmetro e retornar uma string. Dentro deste método, uma variável de string chamada password é inicializada e uma verificação condicional é realizada na propriedade Password do PdfDocument fornecido. Se a senha for uma string vazia, atribua o valor "Iron123" à variável password e retorne-a.

Em seguida, uma instância PdfDocument é criada com o nome de arquivo "StyledDocument.pdf". Um delegado chamado AddPasswordEventHandler é declarado com a mesma assinatura que o método AddPassword. Uma instância desse delegado, denominada handler, recebe o método AddPassword. O delegado é então invocado com o método Invoke, passando a instância document, e a senha retornada é atribuída à propriedade Password do document.

Finalmente, o método SaveAs é chamado no document, salvando-o como "PasswordProtected.pdf". O código usa efetivamente um delegado para determinar e definir dinamicamente uma senha para um PdfDocument com base em certas condições dentro do método AddPassword.

2. Utilizando Delegados para Conteúdo Dinâmico

Os delegados também podem ser utilizados para inserir conteúdo dinâmico no documento PDF. O IronPDF suporta a inserção de conteúdo HTML para gerar PDFs a partir de HTML , e os desenvolvedores podem usar delegates para gerar HTML dinamicamente com base em determinadas condições ou dados:

// Assuming GetDynamicContent is a delegate that generates dynamic HTML content
Func<string> getDynamicContent = () =>
{
    // Custom logic to generate dynamic content
    return "<p>This is dynamic content based on some condition.</p>";
};

// Incorporate dynamic HTML into the PDF
var pdfRenderer = new ChromePdfRenderer();
var pdfDocument = pdfRenderer.RenderHtmlAsPdf($"<html><body>{getDynamicContent()}</body></html>");
pdfDocument.SaveAs("DynamicContentDocument.pdf");
// Assuming GetDynamicContent is a delegate that generates dynamic HTML content
Func<string> getDynamicContent = () =>
{
    // Custom logic to generate dynamic content
    return "<p>This is dynamic content based on some condition.</p>";
};

// Incorporate dynamic HTML into the PDF
var pdfRenderer = new ChromePdfRenderer();
var pdfDocument = pdfRenderer.RenderHtmlAsPdf($"<html><body>{getDynamicContent()}</body></html>");
pdfDocument.SaveAs("DynamicContentDocument.pdf");
' Assuming GetDynamicContent is a delegate that generates dynamic HTML content
Dim getDynamicContent As Func(Of String) = Function()
	' Custom logic to generate dynamic content
	Return "<p>This is dynamic content based on some condition.</p>"
End Function

' Incorporate dynamic HTML into the PDF
Dim pdfRenderer = New ChromePdfRenderer()
Dim pdfDocument = pdfRenderer.RenderHtmlAsPdf($"<html><body>{getDynamicContent()}</body></html>")
pdfDocument.SaveAs("DynamicContentDocument.pdf")
$vbLabelText   $csharpLabel

Neste exemplo, o delegado getDynamicContent gera conteúdo HTML dinamicamente, que é então incorporado no documento PDF.

Delegados em C# (Como funciona para desenvolvedores): Figura 3 - PDF gerado pelo código anterior

Para utilizar o IronPDF de forma eficiente e eficaz, consulte a documentação do IronPDF .

Conclusão

Em conclusão, os delegates em C# são um pilar fundamental da flexibilidade e modularidade do código. Eles permitem que os desenvolvedores implementem funções de retorno de chamada (callbacks), lidem com eventos e adotem paradigmas de programação funcional, como a capacidade de alterar programaticamente as chamadas de método. Como uma ferramenta versátil no conjunto de ferramentas C#, os delegates permitem que os desenvolvedores criem código mais fácil de manter, escalável e expressivo. Seja para criar aplicações orientadas a eventos, implementar mecanismos de retorno de chamada ou explorar a programação funcional, os delegates em C# são um poderoso aliado em sua jornada de programação.

Os delegates do C# e o IronPDF podem formar uma dupla cooperativa, aprimorando os recursos de geração de documentos em seus aplicativos. Seja para personalizar eventos de documentos ou inserir conteúdo dinâmico, os delegates oferecem um mecanismo flexível para estender a funcionalidade do IronPDF. Ao explorar as possibilidades, considere os requisitos específicos do seu projeto e como os delegates podem contribuir para um processo de geração de PDFs mais personalizado e dinâmico com o IronPDF.

O IronPDF oferece um período de teste gratuito para que você possa experimentar todas as suas funcionalidades. Pode ser licenciado para uso comercial a partir de $799.

Perguntas frequentes

O que são delegates em C# e por que são importantes?

Os delegates em C# são ponteiros para métodos com segurança de tipo, permitindo que métodos sejam passados como parâmetros e invocados dinamicamente. Eles são cruciais para escrever código flexível, modular e escalável, possibilitando o tratamento de eventos, callbacks e paradigmas de programação funcional.

Como usar delegates para geração de PDFs em C#?

Os delegates podem ser utilizados para aprimorar a geração de PDFs, permitindo callbacks para eventos do documento e inserindo conteúdo dinâmico nos PDFs. Por exemplo, os delegates podem se inscrever em eventos do documento ou facilitar a geração de conteúdo HTML dinâmico em PDFs usando o IronPDF.

Qual é o papel dos delegates na programação orientada a eventos em C#?

Na programação orientada a eventos, os delegates permitem a criação de manipuladores de eventos que podem responder a eventos específicos, possibilitando um mecanismo de callback limpo e modular para notificar componentes externos quando eventos ocorrem.

Como funcionam os delegates multicast em C#?

Em C#, os delegates multicast permitem que vários métodos sejam combinados em uma única instância de delegate. Isso possibilita a invocação sequencial de todos os métodos no delegate, facilitando cenários complexos de tratamento de eventos.

É possível usar delegates em C# com expressões lambda?

Sim, os delegates em C# podem ser usados com expressões lambda, proporcionando uma maneira concisa de definir corpos de métodos diretamente no código. Isso melhora a legibilidade e a flexibilidade do código, permitindo a fácil atribuição de métodos a delegates.

Como declarar e usar um delegado em C#?

Para usar um delegado em C#, declare um tipo de delegado, instancie-o com uma referência de método e invoque-o para executar os métodos referenciados. Esse processo permite a invocação flexível de métodos e a execução dinâmica de código.

Como os desenvolvedores podem integrar bibliotecas PDF em seus projetos C# para geração de documentos?

Os desenvolvedores podem integrar bibliotecas de PDF instalando o pacote NuGet apropriado por meio do Console do Gerenciador de Pacotes ou pelo próprio Gerenciador de Pacotes NuGet. Bibliotecas como o IronPDF oferecem soluções robustas para geração e manipulação de PDFs.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim