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

C# Parcial (Como funciona para desenvolvedores)

O C# oferece um recurso exclusivo que aprimora a organização e o gerenciamento de código em projetos maiores: a palavra-chave partial. Essa funcionalidade, acessível através do modificador partial , permite que os desenvolvedores dividam a definição de uma classe, interface ou struct em vários arquivos. Essa funcionalidade é particularmente benéfica para trabalhar com código-fonte já gerado, como definições de controles de interface do usuário ou código de encapsulamento de serviços, juntamente com lógica de negócios personalizada. Neste artigo, aprenderemos sobre classes parciais e a biblioteca IronPDF for .NET usando o Visual Studio.

Entendendo a classe parcial

Uma classe parcial, que mantém o mesmo nível de acessibilidade, é definida com o modificador partial em C#, indicando que a definição da classe está distribuída por dois ou mais arquivos dentro do mesmo assembly. Essa abordagem mantém o código relacionado junto, preservando a separação de responsabilidades. Por exemplo, uma classe parcial Employee pode ter sua lógica de negócios em um arquivo e sua camada de acesso a dados em outro, mas ambas as partes são compiladas em uma única classe. Essa separação não só torna o código mais gerenciável, como também permite que vários desenvolvedores trabalhem na mesma classe sem conflitos.

// File 1: Employee_BusinessLogic.cs
public partial class Employee
{
    // Method for calculating pay
    public void CalculatePay() 
    { 
        // Implementation of pay calculation
    }
}

// File 2: Employee_DataAccess.cs
public partial class Employee
{
    // Method for loading employee data
    public void Load() 
    { 
        // Implementation of data loading
    }
}
// File 1: Employee_BusinessLogic.cs
public partial class Employee
{
    // Method for calculating pay
    public void CalculatePay() 
    { 
        // Implementation of pay calculation
    }
}

// File 2: Employee_DataAccess.cs
public partial class Employee
{
    // Method for loading employee data
    public void Load() 
    { 
        // Implementation of data loading
    }
}
' File 1: Employee_BusinessLogic.cs
Partial Public Class Employee
	' Method for calculating pay
	Public Sub CalculatePay()
		' Implementation of pay calculation
	End Sub
End Class

' File 2: Employee_DataAccess.cs
Partial Public Class Employee
	' Method for loading employee data
	Public Sub Load()
		' Implementation of data loading
	End Sub
End Class
$vbLabelText   $csharpLabel

Aproveitando métodos parciais

Classes parciais também podem definir métodos parciais, que são declarados, mas não necessariamente implementados. Esses métodos possibilitam cenários em que parte da classe pode declarar um método sem implementá-lo, permitindo opcionalmente que outra parte da classe o implemente. Caso nenhuma implementação seja fornecida, a chamada parcial do método é removida em tempo de compilação, não resultando em nenhuma perda de desempenho.

// File 1: Employee_BusinessLogic.cs
public partial class Employee
{
    // Declaration of a partial method to be called when pay is calculated
    partial void OnPayCalculated(double amount);

    public void CalculatePay()
    {
        double amount = 1000; // Simplified calculation
        OnPayCalculated(amount); // Call the partial method
    }
}

// File 2: Employee_Events.cs
public partial class Employee
{
    // Implementation of the partial method
    partial void OnPayCalculated(double amount)
    {
        Console.WriteLine($"Pay calculated: {amount}");
    }
}
// File 1: Employee_BusinessLogic.cs
public partial class Employee
{
    // Declaration of a partial method to be called when pay is calculated
    partial void OnPayCalculated(double amount);

    public void CalculatePay()
    {
        double amount = 1000; // Simplified calculation
        OnPayCalculated(amount); // Call the partial method
    }
}

// File 2: Employee_Events.cs
public partial class Employee
{
    // Implementation of the partial method
    partial void OnPayCalculated(double amount)
    {
        Console.WriteLine($"Pay calculated: {amount}");
    }
}
' File 1: Employee_BusinessLogic.cs
Partial Public Class Employee
	' Declaration of a partial method to be called when pay is calculated
	Partial Private Sub OnPayCalculated(ByVal amount As Double)
	End Sub

	Public Sub CalculatePay()
		Dim amount As Double = 1000 ' Simplified calculation
		OnPayCalculated(amount) ' Call the partial method
	End Sub
End Class

' File 2: Employee_Events.cs
Partial Public Class Employee
	' Implementation of the partial method
	Private Sub OnPayCalculated(ByVal amount As Double)
		Console.WriteLine($"Pay calculated: {amount}")
	End Sub
End Class
$vbLabelText   $csharpLabel

Uso avançado de métodos parciais

Os métodos parciais, que incorporam uma abordagem de definição parcial, permitem uma declaração em uma parte de uma classe parcial e uma implementação opcional em outra. Essa funcionalidade é particularmente útil para fornecer pontos de conexão (hooks) no código gerado que podem ser implementados opcionalmente pelos desenvolvedores. A palavra-chave partial indica que o método pode ou não ter uma implementação.

Considere um exemplo em que um componente da interface do usuário precisa executar alguma ação antes que um controle da interface do usuário seja carregado. O método parcial oferece uma maneira clara de inserir lógica de negócios personalizada sem sobrecarregar o código gerado automaticamente.

// File: UIControls_AutoGenerated.cs
public partial class UIControls
{
    // Declaration of a partial method for control loading
    partial void OnControlLoading();

    public void LoadControl()
    {
        OnControlLoading(); // Call the partial method
        // Auto-generated loading logic here
    }
}

// File: UIControls_CustomLogic.cs
public partial class UIControls
{
    // Implementation of the partial method for adding custom logic
    partial void OnControlLoading()
    {
        // Custom business logic code here
        Console.WriteLine("Custom control loading logic executed.");
    }
}
// File: UIControls_AutoGenerated.cs
public partial class UIControls
{
    // Declaration of a partial method for control loading
    partial void OnControlLoading();

    public void LoadControl()
    {
        OnControlLoading(); // Call the partial method
        // Auto-generated loading logic here
    }
}

// File: UIControls_CustomLogic.cs
public partial class UIControls
{
    // Implementation of the partial method for adding custom logic
    partial void OnControlLoading()
    {
        // Custom business logic code here
        Console.WriteLine("Custom control loading logic executed.");
    }
}
' File: UIControls_AutoGenerated.cs
Partial Public Class UIControls
	' Declaration of a partial method for control loading
	Partial Private Sub OnControlLoading()
	End Sub

	Public Sub LoadControl()
		OnControlLoading() ' Call the partial method
		' Auto-generated loading logic here
	End Sub
End Class

' File: UIControls_CustomLogic.cs
Partial Public Class UIControls
	' Implementation of the partial method for adding custom logic
	Private Sub OnControlLoading()
		' Custom business logic code here
		Console.WriteLine("Custom control loading logic executed.")
	End Sub
End Class
$vbLabelText   $csharpLabel

Integrando a lógica de negócios com classes parciais

A lógica de negócios muitas vezes requer modificação e extensão além do que é gerado automaticamente, especialmente em aplicações com regras ou comportamentos complexos. As classes parciais oferecem uma maneira integrada de incluir lógica de negócios em um arquivo de origem separado, sem alterar a interface do usuário gerada automaticamente ou o código de acesso a dados. Essa separação garante que a lógica de negócios seja facilmente acessível e modificável pelos desenvolvedores, aprimorando a colaboração, especialmente quando mais de um desenvolvedor está trabalhando no projeto.

// File: Employee_AutoGenerated.cs
public partial class Employee
{
    // Auto-generated properties and methods
}

// File: Employee_BusinessLogic.cs
public partial class Employee
{
    // Business logic method for promoting an employee
    public void Promote()
    {
        // Business logic code to promote an employee
        Console.WriteLine("Employee promoted.");
    }
}
// File: Employee_AutoGenerated.cs
public partial class Employee
{
    // Auto-generated properties and methods
}

// File: Employee_BusinessLogic.cs
public partial class Employee
{
    // Business logic method for promoting an employee
    public void Promote()
    {
        // Business logic code to promote an employee
        Console.WriteLine("Employee promoted.");
    }
}
' File: Employee_AutoGenerated.cs
Partial Public Class Employee
	' Auto-generated properties and methods
End Class

' File: Employee_BusinessLogic.cs
Partial Public Class Employee
	' Business logic method for promoting an employee
	Public Sub Promote()
		' Business logic code to promote an employee
		Console.WriteLine("Employee promoted.")
	End Sub
End Class
$vbLabelText   $csharpLabel

Tipos Parciais Aninhados

Os tipos parciais aninhados estendem o conceito de classes parciais para classes aninhadas, permitindo que partes de uma classe aninhada sejam definidas em arquivos separados. Isso pode ser particularmente útil para organizar grandes estruturas aninhadas, como uma definição complexa de controle de interface de usuário que inclui vários tipos aninhados para lidar com diversos aspectos do comportamento do controle.

// File: ComplexControl_Part1.cs
public partial class ComplexControl
{
    public partial class NestedControl
    {
        // Method for initializing the nested control
        public void Initialize() 
        { 
            // Initialization code here 
        }
    }
}

// File: ComplexControl_Part2.cs
public partial class ComplexControl
{
    public partial class NestedControl
    {
        // Method for cleaning up the nested control
        public void Cleanup() 
        { 
            // Cleanup code here 
        }
    }
}
// File: ComplexControl_Part1.cs
public partial class ComplexControl
{
    public partial class NestedControl
    {
        // Method for initializing the nested control
        public void Initialize() 
        { 
            // Initialization code here 
        }
    }
}

// File: ComplexControl_Part2.cs
public partial class ComplexControl
{
    public partial class NestedControl
    {
        // Method for cleaning up the nested control
        public void Cleanup() 
        { 
            // Cleanup code here 
        }
    }
}
' File: ComplexControl_Part1.cs
Partial Public Class ComplexControl
	Partial Public Class NestedControl
		' Method for initializing the nested control
		Public Sub Initialize()
			' Initialization code here 
		End Sub
	End Class
End Class

' File: ComplexControl_Part2.cs
Partial Public Class ComplexControl
	Partial Public Class NestedControl
		' Method for cleaning up the nested control
		Public Sub Cleanup()
			' Cleanup code here 
		End Sub
	End Class
End Class
$vbLabelText   $csharpLabel

Aplicações práticas

Classes parciais são particularmente benéficas em cenários que envolvem código-fonte gerado automaticamente, como em formulários, onde o Visual Studio cria formulários do Windows. Essa configuração permite que os desenvolvedores separem o código de design da interface do usuário em um arquivo de origem distinto, possibilitando que eles estendam ou modifiquem a classe sem afetar o design original da interface.

Em aplicações web, as classes parciais facilitam a separação do código de encapsulamento do serviço web gerado da lógica de negócios personalizada, garantindo que as atualizações nos serviços web não sobrescrevam as modificações personalizadas. Da mesma forma, em aplicações que utilizam LINQ to SQL, os arquivos dbml geram definições de classe parciais que podem ser estendidas para incluir funcionalidades adicionais ou lógica de negócios sem alterar o código gerado automaticamente.

// Auto-generated UI class
public partial class MainForm : Form
{
    // Designer code
}

// Custom logic for MainForm
public partial class MainForm
{
    // Custom event handlers and methods
}
// Auto-generated UI class
public partial class MainForm : Form
{
    // Designer code
}

// Custom logic for MainForm
public partial class MainForm
{
    // Custom event handlers and methods
}
' Auto-generated UI class
Partial Public Class MainForm
	Inherits Form

	' Designer code
End Class

' Custom logic for MainForm
Partial Public Class MainForm
	Inherits Form

	' Custom event handlers and methods
End Class
$vbLabelText   $csharpLabel

IronPDF: Biblioteca PDF em C

C# Parcial (Como funciona para desenvolvedores): Figura 1 - IronPDF

IronPDF é uma biblioteca completa for .NET que permite aos desenvolvedores criar, ler e editar documentos PDF em seus aplicativos. Oferece uma abordagem direta para gerar PDFs a partir de HTML usando IronPDF , URLs, imagens, ASPX e texto, tornando-se uma ferramenta versátil para relatórios, geração de documentos e arquivamento de conteúdo da web. O IronPDF se destaca pela sua facilidade de uso, exigindo configuração mínima para integração em qualquer projeto .NET , incluindo aplicativos desenvolvidos com C#.

Integrando o IronPDF com classes parciais

Para ilustrar a integração do IronPDF com classes parciais, vamos considerar um exemplo em que temos uma aplicação web que gera relatórios em formato PDF. Vamos dividir a funcionalidade em arquivos de classe parciais para manter nossa lógica de negócios separada da nossa lógica de geração de PDF.

Configurando o IronPDF

Primeiro, certifique-se de que o IronPDF foi adicionado ao seu projeto. Normalmente, isso pode ser feito através do Gerenciador de Pacotes NuGet com o seguinte comando:

Install-Package IronPdf

Criando a classe parcial para geração de relatórios

Dividiremos nossa classe em duas partes: uma para a lógica de negócios relacionada aos dados do relatório e outra para a geração de PDFs usando o IronPDF.

Arquivo 1: ReportGenerator_BusinessLogic.cs

Este arquivo contém a lógica de negócios para preparar os dados do relatório.

public partial class ReportGenerator
{
    // Method to get data for the report
    public IEnumerable<string> GetDataForReport()
    {
        // Imagine this method fetches and prepares data for the report
        return new List<string> { "Data1", "Data2", "Data3" };
    }
}
public partial class ReportGenerator
{
    // Method to get data for the report
    public IEnumerable<string> GetDataForReport()
    {
        // Imagine this method fetches and prepares data for the report
        return new List<string> { "Data1", "Data2", "Data3" };
    }
}
Partial Public Class ReportGenerator
	' Method to get data for the report
	Public Function GetDataForReport() As IEnumerable(Of String)
		' Imagine this method fetches and prepares data for the report
		Return New List(Of String) From {"Data1", "Data2", "Data3"}
	End Function
End Class
$vbLabelText   $csharpLabel

Arquivo 2: ReportGenerator_PdfGeneration.cs

Este arquivo utiliza o IronPDF para gerar um relatório em PDF a partir dos dados preparados.

public partial class ReportGenerator
{
    // Method to generate PDF report using IronPDF
    public void GeneratePdfReport()
    {
        var renderer = new IronPdf.ChromePdfRenderer();
        var data = GetDataForReport();
        var htmlContent = $"<html><body><h1>Report</h1><p>{string.Join("</p><p>", data)}</p></body></html>";

        // Generate PDF from HTML string
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);

        // Save the PDF to a file
        pdf.SaveAs("Report.pdf");
        Console.WriteLine("Report generated successfully.");
    }
}
public partial class ReportGenerator
{
    // Method to generate PDF report using IronPDF
    public void GeneratePdfReport()
    {
        var renderer = new IronPdf.ChromePdfRenderer();
        var data = GetDataForReport();
        var htmlContent = $"<html><body><h1>Report</h1><p>{string.Join("</p><p>", data)}</p></body></html>";

        // Generate PDF from HTML string
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);

        // Save the PDF to a file
        pdf.SaveAs("Report.pdf");
        Console.WriteLine("Report generated successfully.");
    }
}
Partial Public Class ReportGenerator
	' Method to generate PDF report using IronPDF
	Public Sub GeneratePdfReport()
		Dim renderer = New IronPdf.ChromePdfRenderer()
		Dim data = GetDataForReport()
		Dim htmlContent = $"<html><body><h1>Report</h1><p>{String.Join("</p><p>", data)}</p></body></html>"

		' Generate PDF from HTML string
		Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)

		' Save the PDF to a file
		pdf.SaveAs("Report.pdf")
		Console.WriteLine("Report generated successfully.")
	End Sub
End Class
$vbLabelText   $csharpLabel

Uso

Com a configuração parcial da classe, gerar um relatório em PDF torna-se uma questão de invocar o método GeneratePdfReport em uma instância da classe ReportGenerator .

var reportGenerator = new ReportGenerator();
reportGenerator.GeneratePdfReport();
var reportGenerator = new ReportGenerator();
reportGenerator.GeneratePdfReport();
Dim reportGenerator As New ReportGenerator()
reportGenerator.GeneratePdfReport()
$vbLabelText   $csharpLabel

C# Parcial (Como funciona para desenvolvedores): Figura 2 - Saída do relatório em PDF

Conclusão

C# Parcial (Como funciona para desenvolvedores): Figura 3 - Licenciamento

O uso de classes parciais, métodos parciais e tipos parciais aninhados em C# fornece aos desenvolvedores uma ferramenta flexível e poderosa para organização e gerenciamento de código. Ao separar o código gerado automaticamente da lógica de negócios, das definições de controle da interface do usuário e de outras partes do aplicativo, os desenvolvedores podem criar aplicativos mais fáceis de manter, legíveis e escaláveis.

Ao separar as responsabilidades da lógica de negócios e do processamento de PDFs, os desenvolvedores podem alcançar melhor organização do código, facilidade de manutenção e escalabilidade. Os recursos robustos do IronPDF, combinados com os benefícios organizacionais das classes parciais, criam um conjunto de ferramentas poderoso para desenvolvedores .NET que trabalham com PDFs em seus projetos. Você pode experimentar o IronPDF gratuitamente usando o período de teste gratuito disponível no IronPDF . Se você estiver interessado em comprar, a licença do IronPDF começa em $799.

Perguntas frequentes

Qual a finalidade de usar classes parciais em C#?

Em C#, classes parciais são usadas para dividir a definição de uma classe, interface ou struct em vários arquivos. Isso é particularmente útil para separar o código gerado automaticamente, como controles de interface do usuário, da lógica de negócios personalizada, melhorando assim o gerenciamento e a organização do código.

Como as classes parciais podem ser benéficas em uma aplicação web?

Em uma aplicação web, as classes parciais permitem que os desenvolvedores separem o código de design da interface do usuário da lógica de negócios personalizada. Essa separação ajuda a manter uma arquitetura de código limpa, facilitando o gerenciamento e a escalabilidade da aplicação à medida que ela cresce.

Qual é a importância da palavra-chave ` partial em C#?

A palavra-chave partial em C# indica que a definição de uma classe, interface ou struct é dividida em múltiplas partes em arquivos diferentes. Esse recurso é crucial para o gerenciamento de grandes bases de código, especialmente ao lidar com código gerado automaticamente.

É possível integrar a geração de PDFs com classes parciais em C#?

Sim, é possível integrar a geração de PDFs com classes parciais em C#. Utilizando uma biblioteca como o IronPDF, você pode separar a lógica de geração de PDFs em uma classe parcial, mantendo-a distinta de outras lógicas de negócios e melhorando a clareza do código.

Como funcionam os métodos parciais dentro de classes parciais?

Métodos parciais em classes parciais são declarados sem implementação em uma parte da classe e podem ser implementados opcionalmente em outra. Se um método parcial for declarado, mas não implementado, ele será removido durante a compilação, evitando qualquer sobrecarga de desempenho.

O que são tipos parciais aninhados e quais são seus casos de uso?

Tipos parciais aninhados permitem que partes de uma classe aninhada sejam definidas em arquivos separados. Essa ferramenta de organização é útil para gerenciar estruturas complexas, como controles de interface do usuário com múltiplos tipos aninhados, possibilitando um melhor gerenciamento de código.

Como instalar uma biblioteca .NET para funcionalidade de PDF?

Uma biblioteca .NET para funcionalidade de PDF, como o IronPDF, pode ser instalada usando o Gerenciador de Pacotes NuGet. Você usaria um comando específico para o pacote, por exemplo: Install-Package IronPDF .

Quais são as vantagens de usar classes parciais para desenvolvimento colaborativo?

Classes parciais facilitam o desenvolvimento colaborativo, permitindo que vários desenvolvedores trabalhem em diferentes partes da mesma classe sem conflitos de código. Isso é conseguido dividindo a classe em arquivos diferentes, o que facilita o gerenciamento de modificações simultâneas.

Como organizar a lógica de geração de PDF em um projeto C#?

A lógica de geração de PDFs pode ser organizada em um projeto C# usando classes parciais para separar essa funcionalidade de outras lógicas de negócio. Essa abordagem melhora a gerenciabilidade e a clareza do código, especialmente ao utilizar bibliotecas como o IronPDF para criação e manipulação de PDFs.

Por que as classes parciais são úteis para código gerado automaticamente?

Classes parciais são particularmente úteis para código gerado automaticamente, pois permitem que os desenvolvedores adicionem lógica personalizada sem alterar as partes geradas automaticamente. Essa segregação garante que quaisquer atualizações no código gerado não interrompam as implementações personalizadas.

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