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

Construtor primário em C# (Como funciona para desenvolvedores)

No cenário de programação orientada a objetos em C#, a introdução dos construtores primários traz um novo nível de elegância e simplicidade à linguagem. Os construtores primários, juntamente com recursos como interceptores e expressões de coleção, surgiram no C# 12 como um recurso poderoso, oferecendo uma sintaxe mais concisa para declarar construtores com parâmetros. Você pode explorar os construtores primários em detalhes no guia do Microsoft C# .

Neste artigo, aprenderemos como usar os construtores primários do C# 12 de forma eficiente, explorando também sua funcionalidade, casos de uso e como eles transformam a maneira como os desenvolvedores abordam a inicialização de classes.

Noções básicas: Construtores em C

Os construtores desempenham um papel fundamental na programação orientada a objetos, servindo como modelo para a inicialização de objetos. Tradicionalmente, os desenvolvedores de C# usam o construtor padrão ou construtores parametrizados para definir o estado inicial de suas classes. No entanto, a introdução dos construtores primários adiciona uma abordagem mais simplificada a esse aspecto essencial do desenvolvimento em C#.

A essência dos construtores primários

Um construtor primário em C# é uma maneira concisa de declarar e inicializar propriedades diretamente dentro da declaração da classe. Simplifica o processo de definição e atribuição de valores às propriedades, oferecendo uma sintaxe mais declarativa e legível.

Benefícios dos Construtores Primários

  1. Concisão: Os construtores primários fornecem uma sintaxe sucinta, reduzindo o código repetitivo e melhorando a legibilidade.
  2. Escopo: Ao contrário dos construtores tradicionais, os parâmetros nos construtores primários estão no escopo de toda a classe ou struct, oferecendo flexibilidade em seu uso.
  3. Valores padrão: Os valores padrão dos parâmetros simplificam a criação de objetos, tornando-a mais conveniente para os desenvolvedores.

Declarando um construtor primário

A sintaxe de um construtor primário envolve a declaração das propriedades diretamente no cabeçalho da classe. Vamos considerar um exemplo básico de classe Person:

public class Person(string name, int age)
{
    public string Name { get; } = name;
    public int Age { get; } = age;
    public override string ToString() => $"Name: {Name}, Age: {Age}";
}
public class Person(string name, int age)
{
    public string Name { get; } = name;
    public int Age { get; } = age;
    public override string ToString() => $"Name: {Name}, Age: {Age}";
}
Public Class Person(String name, Integer age)
	Public ReadOnly Property Name() As String = name
	Public ReadOnly Property Age() As Integer = age
	Public Overrides Function ToString() As String
		Return $"Name: {Name}, Age: {Age}"
	End Function
End Class
$vbLabelText   $csharpLabel

No trecho de código acima, a classe Person possui um construtor primário que inicializa as propriedades Name e Age , membros da instância. Os parâmetros do construtor são declarados com o nome da classe ou da estrutura, e, no momento da definição das propriedades públicas, os valores dos parâmetros são atribuídos a eles.

Exemplo 1: Ponto imutável no espaço bidimensional

public readonly struct Point(double x, double y)
{
    public double X { get; } = x;
    public double Y { get; } = y;
    public double Magnitude => Math.Sqrt(X * X + Y * Y);
}
public readonly struct Point(double x, double y)
{
    public double X { get; } = x;
    public double Y { get; } = y;
    public double Magnitude => Math.Sqrt(X * X + Y * Y);
}
'INSTANT VB WARNING: VB has no equivalent to the C# readonly struct:
'ORIGINAL LINE: public readonly struct Point(double x, double y)
Public Structure Point(Double x, Double y)
	Public ReadOnly Property X() As Double = x
	Public ReadOnly Property Y() As Double = y
	Public ReadOnly Property Magnitude() As Double
		Get
			Return Math.Sqrt(X * X + Y * Y)
		End Get
	End Property
End Structure
$vbLabelText   $csharpLabel

Neste exemplo, o construtor principal da estrutura Point inicializa as propriedades X e Y , demonstrando como a sintaxe pode ser concisa e expressiva.

Exemplo 2: Registrador configurável com configurações padrão

public class Logger(string filePath = "log.txt", LogLevel level = LogLevel.Info)
{
    private readonly string _filePath = filePath;
    private readonly LogLevel _level = level;

    public void Log(string message)
    {
        // Actual logging implementation using _filePath and _level
    }
}
public class Logger(string filePath = "log.txt", LogLevel level = LogLevel.Info)
{
    private readonly string _filePath = filePath;
    private readonly LogLevel _level = level;

    public void Log(string message)
    {
        // Actual logging implementation using _filePath and _level
    }
}
'INSTANT VB TODO TASK: The following line contains an assignment within expression that was not extracted by Instant VB:
'ORIGINAL LINE: public class Logger(string filePath = "log.txt", LogLevel level = LogLevel.Info)
Public Class Logger(String filePath = "log.txt", LogLevel level = LogLevel.Info)
	Private ReadOnly _filePath As String = filePath
	Private ReadOnly _level As LogLevel = level

	Public Sub Log(ByVal message As String)
		' Actual logging implementation using _filePath and _level
	End Sub
End Class
$vbLabelText   $csharpLabel

Aqui, o construtor principal da classe Logger fornece valores padrão para filePath e level , tornando-a flexível e fácil de usar, ao mesmo tempo que mantém a capacidade de configuração.

Exemplo 3: Injeção de Dependência

public interface IService
{
    Distance GetDistance();
}

public class ExampleController(IService service) : ControllerBase
{
    public ActionResult<Distance> Get() => service.GetDistance();
}
public interface IService
{
    Distance GetDistance();
}

public class ExampleController(IService service) : ControllerBase
{
    public ActionResult<Distance> Get() => service.GetDistance();
}
Public Interface IService
	Function GetDistance() As Distance
End Interface

Public Class ExampleController(IService service)
	Inherits ControllerBase

	Public Function [Get]() As ActionResult(Of Distance)
		Return service.GetDistance()
	End Function
End Class
$vbLabelText   $csharpLabel

Os construtores primários são adequados para cenários de injeção de dependência. Neste exemplo, uma classe controladora indica suas dependências, melhorando a manutenção e facilitando os testes unitários.

Exemplo 4: Construindo uma Hierarquia de Formas Geométricas

public abstract class Shape(double width, double height)
{
    public double Width { get; } = width;
    public double Height { get; } = height;
    public abstract double CalculateArea();
}

public class Rectangle(double width, double height) : Shape(width, height)
{
    public override double CalculateArea() => Width * Height;
}

public class Circle : Shape
{
    public Circle(double radius) : base(radius * 2, radius * 2) { }
    public override double CalculateArea() => Math.PI * Math.Pow(Width / 2, 2);
}
public abstract class Shape(double width, double height)
{
    public double Width { get; } = width;
    public double Height { get; } = height;
    public abstract double CalculateArea();
}

public class Rectangle(double width, double height) : Shape(width, height)
{
    public override double CalculateArea() => Width * Height;
}

public class Circle : Shape
{
    public Circle(double radius) : base(radius * 2, radius * 2) { }
    public override double CalculateArea() => Math.PI * Math.Pow(Width / 2, 2);
}
Public MustInherit Class Shape(Double width, Double height)
	Public ReadOnly Property Width() As Double = width
	Public ReadOnly Property Height() As Double = height
	Public MustOverride Function CalculateArea() As Double
End Class

Public Class Rectangle(Double width, Double height)
	Inherits Shape(width, height)

	Public Overrides Function CalculateArea() As Double
		Return Width * Height
	End Function
End Class

Public Class Circle
	Inherits Shape

	Public Sub New(ByVal radius As Double)
		MyBase.New(radius * 2, radius * 2)
	End Sub
	Public Overrides Function CalculateArea() As Double
		Return Math.PI * Math.Pow(Width / 2, 2)
	End Function
End Class
$vbLabelText   $csharpLabel

Neste exemplo, o construtor principal da classe Shape forma a base para uma hierarquia de formas geométricas. Subclasses como Rectangle e Circle aproveitam o construtor principal para uma inicialização consistente. A própria classe Rectangle declara o construtor primário e passa os parâmetros capturados do construtor primário para os parâmetros primários da classe Shape . A classe Circle demonstra flexibilidade ao definir seu construtor dentro da própria classe e, em seguida, passar seus parâmetros como valores padrão para o construtor Shape usando a palavra-chave base .

Apresentando o IronPDF

IronPDF é uma biblioteca C# versátil que permite aos desenvolvedores criar, manipular e converter arquivos PDF sem esforço. Seja para gerar faturas, relatórios ou qualquer outro documento, o IronPDF permite converter conteúdo HTML em PDFs profissionais e refinados diretamente em sua aplicação C#.

O IronPDF é uma ferramenta prática para desenvolvedores que permite converter páginas da web, URLs e HTML em PDF . A melhor parte é que os PDFs ficam exatamente iguais às páginas da web originais, com toda a formatação e estilo preservados. É perfeito para criar PDFs a partir de conteúdo da web, como relatórios e faturas.

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

Construtor Primário em C# (Como Funciona para o Desenvolvedor): Figura 1 - Página web do IronPDF

Instalando o IronPDF: Um Guia Rápido

Para incorporar o IronPDF ao seu projeto C#, comece instalando o pacote NuGet do IronPDF . Execute o seguinte comando no console do seu gerenciador de pacotes:

Install-Package IronPdf

Como alternativa, localize o pacote "IronPDF" no Gerenciador de Pacotes NuGet e prossiga com a instalação a partir daí.

Construtor Primário em C# (Como Funciona para o Desenvolvedor): Figura 2 - Buscando o pacote IronPDF no navegador do gerenciador de pacotes NuGet

Gerando PDFs com o IronPDF

Criar um PDF usando o IronPDF é um processo simplificado. Considere o seguinte exemplo:

var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
// Create a new PDF document
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
// Create a new PDF document
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
Dim htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>"
' Create a new PDF document
Dim pdfDocument = New IronPdf.ChromePdfRenderer()
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf")
$vbLabelText   $csharpLabel

Neste exemplo, o IronPDF é utilizado para renderizar conteúdo HTML em um documento PDF, que posteriormente é salvo no local especificado. Para obter mais detalhes sobre como criar e manipular PDFs em C#, visite este tutorial completo e, para explorar mais, visite esta página de documentação .

Construtores primários em C#: uma revolução na inicialização de classes

Os construtores primários em C# oferecem uma abordagem declarativa e simplificada para inicializar propriedades de classe diretamente na declaração da classe. Vamos explorar se esse recurso elegante pode ser integrado perfeitamente ao IronPDF.

Integração de construtores primários em C# com o IronPDF

Embora os construtores primários do C# sejam principalmente um recurso da linguagem focado na inicialização de classes, sua integração direta com o IronPDF pode não ser um caso de uso comum. A funcionalidade principal do IronPDF reside na geração e manipulação de documentos PDF, e os detalhes da inicialização de classes podem não estar diretamente alinhados com esse fluxo de trabalho.

No entanto, os desenvolvedores podem aproveitar os construtores primários do C# ao definir classes ou estruturas personalizadas relacionadas às configurações ou modelos de dados do IronPDF . Por exemplo, se sua aplicação requer uma estrutura de classes específica para gerenciar configurações ou definições relacionadas a PDFs, os construtores primários em C# podem ser uma ferramenta valiosa para inicializar essas classes de forma concisa.

public class PdfGenerationSettings(string title, bool includeHeader, bool includeFooter)
{
    public string Title { get; } = title;
    public bool IncludeHeader { get; } = includeHeader;
    public bool IncludeFooter { get; } = includeFooter;
    // Additional properties...
}

// Usage with IronPDF
var pdfSettings = new PdfGenerationSettings("My PDF Title", true, false);
var renderOptions = new ChromePdfRenderOptions
{
    PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
    MarginTop = 20,
    MarginBottom = 20,
    MarginLeft = 10,
    MarginRight = 10,
    Title = pdfSettings.Title
};
// Apply settings from PdfGenerationSettings
if (pdfSettings.IncludeHeader)
{
    renderOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Page {page} of {total-pages}",
        DrawDividerLine = true
    };
}
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderingOptions = renderOptions;
pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>").SaveAs("CustomizedDocument.pdf");
public class PdfGenerationSettings(string title, bool includeHeader, bool includeFooter)
{
    public string Title { get; } = title;
    public bool IncludeHeader { get; } = includeHeader;
    public bool IncludeFooter { get; } = includeFooter;
    // Additional properties...
}

// Usage with IronPDF
var pdfSettings = new PdfGenerationSettings("My PDF Title", true, false);
var renderOptions = new ChromePdfRenderOptions
{
    PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
    MarginTop = 20,
    MarginBottom = 20,
    MarginLeft = 10,
    MarginRight = 10,
    Title = pdfSettings.Title
};
// Apply settings from PdfGenerationSettings
if (pdfSettings.IncludeHeader)
{
    renderOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Page {page} of {total-pages}",
        DrawDividerLine = true
    };
}
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderingOptions = renderOptions;
pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>").SaveAs("CustomizedDocument.pdf");
Public Class PdfGenerationSettings(String title, Boolean includeHeader, Boolean includeFooter)
	Public ReadOnly Property Title() As String = title
	Public ReadOnly Property IncludeHeader() As Boolean = includeHeader
	Public ReadOnly Property IncludeFooter() As Boolean = includeFooter
	' Additional properties...
End Class

' Usage with IronPDF
Private pdfSettings = New PdfGenerationSettings("My PDF Title", True, False)
Private renderOptions = New ChromePdfRenderOptions With {
	.PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
	.MarginTop = 20,
	.MarginBottom = 20,
	.MarginLeft = 10,
	.MarginRight = 10,
	.Title = pdfSettings.Title
}
' Apply settings from PdfGenerationSettings
If pdfSettings.IncludeHeader Then
	renderOptions.TextHeader = New TextHeaderFooter With {
		.CenterText = "Page {page} of {total-pages}",
		.DrawDividerLine = True
	}
End If
Dim pdfDocument = New IronPdf.ChromePdfRenderer()
pdfDocument.RenderingOptions = renderOptions
pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>").SaveAs("CustomizedDocument.pdf")
$vbLabelText   $csharpLabel

Neste exemplo, a classe PdfGenerationSettings utiliza um construtor primário em C# para inicializar propriedades relacionadas às configurações de geração de PDF, que podem ser usadas posteriormente para determinar quais opções de renderização adicionar e quais ignorar. A saída contém um texto de cabeçalho e um título, conforme definidos pelo parâmetro do construtor primário.

Construtor Primário em C# (Como Funciona para o Desenvolvedor): Figura 3 - PDF de saída do exemplo de código acima

Conclusão

Em conclusão, os construtores primários em C# apresentam uma abordagem refinada e expressiva para a inicialização de classes. Sua sintaxe declarativa melhora a legibilidade do código, promove a imutabilidade e simplifica o processo de criação de objetos com valores padrão. Seja definindo propriedades, impondo imutabilidade ou adotando valores padrão, os construtores primários permitem que os desenvolvedores dominem a arte da inicialização de classes no mundo dinâmico da programação em C#.

Embora a integração direta dos construtores primários do C# com o IronPDF possa não ser o foco principal, esses dois elementos podem funcionar em harmonia. Os construtores primários em C# aprimoram a clareza e a simplicidade da inicialização de classes, tornando-os valiosos para definir estruturas ou configurações relacionadas aos fluxos de trabalho do IronPDF .

Aproveite o poder do IronPDF para gerar PDFs robustos e utilize construtores primários em C# onde a elegância na inicialização de classes é fundamental. Essa dupla dinâmica permite que você navegue pelas complexidades da geração de documentos com criatividade e eficiência no vibrante mundo da programação em C#.

O IronPDF oferece um teste gratuito e sua licença lite começa a partir de $799.

Perguntas frequentes

Como os construtores primários tornam o código C# mais conciso?

Os construtores primários permitem declarar e inicializar propriedades diretamente na declaração da classe, reduzindo a quantidade de código repetitivo e melhorando a legibilidade.

Quais são as novas funcionalidades introduzidas no C# 12?

O C# 12 introduz construtores primários, interceptores e expressões de coleção, que, em conjunto, oferecem opções de sintaxe mais concisas e poderosas para os desenvolvedores.

Os construtores primários podem ser usados com estruturas de dados imutáveis?

Sim, os construtores primários são adequados para estruturas de dados imutáveis, pois permitem a inicialização de propriedades somente leitura diretamente dentro do construtor.

Como posso converter conteúdo HTML em PDF usando C#?

Você pode usar a classe ChromePdfRenderer do IronPDF para converter conteúdo HTML em PDF, garantindo que a formatação e o estilo sejam preservados no documento de saída.

Quais são as vantagens de usar o IronPDF para geração de PDFs?

O IronPDF oferece uma plataforma robusta para criar e manipular arquivos PDF em C#, com suporte a recursos como conversão de HTML para PDF, mesclagem de PDFs e preservação detalhada do estilo.

Como os construtores primários aprimoram a injeção de dependência?

Os construtores primários aprimoram a injeção de dependência ao indicar claramente as dependências de classe nos parâmetros do construtor, o que simplifica a configuração e a manutenção do grafo de dependências.

Como os construtores primários podem ser integrados à geração de documentos PDF?

Os construtores primários podem ser usados para inicializar classes ou estruturas de configuração associadas às configurações de PDF ao usar uma biblioteca como o IronPDF, simplificando o processo de configuração.

Quais são alguns exemplos práticos de Construtores Primários em ação?

Exemplos práticos incluem a inicialização de hierarquias de formas geométricas e cenários de injeção de dependência, onde clareza e concisão são essenciais.

Como os desenvolvedores podem começar a usar o IronPDF em seus projetos?

Os desenvolvedores podem instalar o pacote NuGet IronPDF através do Console do Gerenciador de Pacotes ou do Gerenciador de Pacotes NuGet e consultar a documentação completa para obter detalhes de implementação.

Qual o papel do IronPDF nos fluxos de trabalho de geração de documentos?

O IronPDF aprimora os fluxos de trabalho de geração de documentos, permitindo que os desenvolvedores criem, convertam e manipulem PDFs facilmente em C#, oferecendo integração perfeita com outros recursos do C#.

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