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

Registros vs. Classes em C# (Como funciona para desenvolvedores)

No mundo do C#, duas estruturas principais são utilizadas para modelar e encapsular dados: classes e registros . Ambos servem como tipos de referência, mas diferem significativamente em seu uso pretendido, comportamento e na forma como lidam com a igualdade. Este guia irá analisar essas diferenças, fornecendo exemplos claros e usos práticos para auxiliar os desenvolvedores na escolha da estrutura adequada às suas necessidades. Também aprenderemos sobre a biblioteca IronPDF .

Classes em C#: O Básico

As classes têm sido um pilar da programação orientada a objetos em C#, projetadas para encapsular dados e comportamento. São tipos de referência, o que significa que duas instâncias de uma classe com os mesmos valores são consideradas dois objetos separados. Essa distinção é crucial ao comparar duas instâncias de classe; A comparação padrão é baseada em referência, não em valor.

public class Person
{
    public int Id { get; set; }
    public string FullName { get; set; }
}
public class Person
{
    public int Id { get; set; }
    public string FullName { get; set; }
}
Public Class Person
	Public Property Id() As Integer
	Public Property FullName() As String
End Class
$vbLabelText   $csharpLabel

No exemplo acima, Pessoa é uma classe com propriedades Id e FullName . Mesmo que duas instâncias de Pessoa tenham valores idênticos de Id e FullName , elas não são consideradas iguais por padrão, pois são duas referências diferentes na memória.

Registros em C#: Estruturas de Dados Imutáveis

Introduzido em C#, o tipo de registro é uma adição mais recente que visa simplificar a criação de estruturas de dados imutáveis, fornecendo uma alternativa robusta às estruturas de classe tradicionais. Diferentemente das classes, os registros oferecem semântica de igualdade baseada em valores, tornando-os ideais para objetos de transferência de dados ou pequenas estruturas de dados com pouco ou nenhum comportamento.

public record Person(int Id, string FullName);
public record Person(int Id, string FullName);
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Person(int Id, string FullName)
$vbLabelText   $csharpLabel

No exemplo acima, a definição do registro é mais sucinta, reduzindo o código repetitivo. Os registros suportam automaticamente mutações não destrutivas e comparações baseadas em valores. Duas instâncias de registro com os mesmos valores são consideradas iguais, em consonância com a semântica de valores.

Usos práticos: Quando usar record versus classe

A escolha entre uma classe e um registro, ou outras estruturas de dados em C#, depende da complexidade dos dados que você está modelando e dos comportamentos exigidos pela sua aplicação. As classes são projetadas especificamente para estruturas de dados complexas, acomodando comportamentos (métodos) e permitindo instâncias mutáveis ​​conforme necessário. Os registros, por outro lado, são exemplos perfeitos de uma estrutura de dados simples, projetada com características imutáveis ​​e igualdade baseada em valores, ideal para dados que permanecem constantes após a criação.

As classes são ideais quando sua estrutura de dados exige o encapsulamento de dados e comportamentos ou quando você precisa manipular os dados após sua criação. Essa flexibilidade faz das classes uma opção preferencial para a maioria dos cenários tradicionais de programação orientada a objetos e para a criação de estruturas de dados complexas.

Os registros se destacam em cenários onde a imutabilidade dos dados é crucial ou quando se lida com estruturas de dados simples que servem principalmente como contêineres de dados. A igualdade baseada em valores que elas proporcionam e a sintaxe concisa as tornam excelentes para objetos de transferência de dados ou objetos de valor.

Tipos de valor e tipos de referência

Entender a diferença entre tipo de valor e tipo de referência em C# é fundamental. Classes são tipos de referência, o que significa que variáveis ​​armazenam uma referência aos dados reais na memória. Essa característica leva à comparação de igualdade baseada em referência por padrão.

Os registros, embora também sejam tipos de referência, emulam a semântica de valor por meio de sua igualdade baseada em valor integrada, fazendo com que se comportem de maneira semelhante aos tipos de valor em comparações.

Exemplos de código: Implementando classes e registros

Vamos implementar uma classe e um registro para destacar as diferenças de sintaxe e comportamento.

Implementação da classe:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Product(int id, string name)
    {
        Id = id;
        Name = name;
    }
}
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Product(int id, string name)
    {
        Id = id;
        Name = name;
    }
}
Public Class Product
	Public Property Id() As Integer
	Public Property Name() As String

	Public Sub New(ByVal id As Integer, ByVal name As String)
		Me.Id = id
		Me.Name = name
	End Sub
End Class
$vbLabelText   $csharpLabel

Implementação de registros:

public record Product(int Id, string Name);
public record Product(int Id, string Name);
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Product(int Id, string Name)
$vbLabelText   $csharpLabel

Observe a brevidade e a simplicidade da implementação do registro. O registro gera automaticamente o construtor, as propriedades e os métodos para igualdade baseada em valores.

Entendendo a Igualdade: Referência vs. Valor

A principal diferença entre classes e registros em C# reside, de fato, em como eles lidam com a igualdade:

  1. Por padrão, as classes usam igualdade de referência, o que significa que duas instâncias são iguais se apontarem para o mesmo local de memória.

  2. Por padrão, os registros utilizam a igualdade de valores, considerando duas instâncias iguais se suas propriedades tiverem os mesmos valores.

Exemplo de Igualdade de Referência (Classe)

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var classInstance1 = new Person { Id = 1, Name = "Iron Software" };
var classInstance2 = new Person { Id = 1, Name = "Iron Software" };
Console.WriteLine(classInstance1 == classInstance2); // Outputs: False
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var classInstance1 = new Person { Id = 1, Name = "Iron Software" };
var classInstance2 = new Person { Id = 1, Name = "Iron Software" };
Console.WriteLine(classInstance1 == classInstance2); // Outputs: False
Public Class Person
	Public Property Id() As Integer
	Public Property Name() As String
End Class

Private classInstance1 = New Person With {
	.Id = 1,
	.Name = "Iron Software"
}
Private classInstance2 = New Person With {
	.Id = 1,
	.Name = "Iron Software"
}
Console.WriteLine(classInstance1 = classInstance2) ' Outputs: False
$vbLabelText   $csharpLabel

Duas instâncias de uma classe com os mesmos valores de propriedade não são consideradas iguais porque são objetos diferentes na memória.

Exemplo de igualdade de valores

public record Person(int Id, string Name);

var recordInstance1 = new Person(1, "Iron Software");
var recordInstance2 = new Person(1, "Iron Software");
Console.WriteLine(recordInstance1 == recordInstance2); // Outputs: True
public record Person(int Id, string Name);

var recordInstance1 = new Person(1, "Iron Software");
var recordInstance2 = new Person(1, "Iron Software");
Console.WriteLine(recordInstance1 == recordInstance2); // Outputs: True
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Person(int Id, string Name)

Private recordInstance1 = New Person(1, "Iron Software")
Private recordInstance2 = New Person(1, "Iron Software")
Console.WriteLine(recordInstance1 = recordInstance2) ' Outputs: True
$vbLabelText   $csharpLabel

Por padrão, duas instâncias de um registro com os mesmos valores de propriedade são consideradas iguais.

Recursos avançados: Registros

Os registros vêm com diversos recursos avançados que atendem à necessidade de estruturas de dados imutáveis ​​e igualdade baseada em valores. A expressão with permite criar uma nova instância de registro copiando um registro existente, mas com algumas propriedades modificadas, demonstrando uma mutação não destrutiva.

Mutação não destrutiva com registros:

var originalRecord = new Person(1, "Doe");
var modifiedRecord = originalRecord with { Name = "Iron Developer" };
var originalRecord = new Person(1, "Doe");
var modifiedRecord = originalRecord with { Name = "Iron Developer" };
Dim originalRecord = New Person(1, "Doe")
'INSTANT VB TODO TASK: C# 'with expressions' are not converted by Instant VB:
'var modifiedRecord = originalRecord with { Name = "Iron Developer" }
$vbLabelText   $csharpLabel

Essa funcionalidade é útil ao trabalhar com estruturas de dados imutáveis, pois oferece uma maneira de "modificar" uma instância sem alterar os dados originais.

Introdução à Biblioteca IronPDF

 Página web do IronPDF

IronPDF é uma biblioteca PDF para desenvolvedores .NET , que oferece uma solução completa para criar, editar e gerenciar documentos PDF diretamente em aplicativos .NET . Simplifica o processo de geração de PDFs, permitindo que os desenvolvedores convertam HTML em PDFs , CSS, JavaScript e imagens em PDFs. O IronPDF oferece suporte a uma variedade de frameworks .NET e tipos de projeto, incluindo aplicativos web, desktop e console, em diversos sistemas operacionais, como Windows, Linux e macOS.

Além da criação de PDFs, o IronPDF oferece recursos para editar PDFs, definir propriedades e segurança, trabalhar com formulários em PDF e extrair conteúdo. Ele foi projetado para atender às necessidades de desenvolvedores que buscam uma ferramenta confiável para integrar a funcionalidade de PDF em seus projetos .NET .

Exemplo de código

A criação de um PDF em C# usando o IronPDF pode ser feita tanto com classes quanto com registros. Abaixo estão exemplos de ambas as abordagens para gerar um documento PDF simples. A principal diferença entre classes e registros em C# reside em seu uso pretendido: as classes são mutáveis ​​por padrão e projetadas para programação orientada a objetos tradicional, enquanto os registros são imutáveis ​​e projetados para programação baseada em valores, tornando-os ideais para modelagem de dados.

Usando uma classe

Neste exemplo, definiremos uma classe PdfGenerator que contém um método para criar um PDF a partir de uma string HTML fornecida.

using IronPdf;
using System;

public class PdfGenerator
{
    public string HtmlContent { get; set; }

    public PdfGenerator(string htmlContent)
    {
        HtmlContent = htmlContent;
    }

    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key"; // Set your license key here

        var generator = new PdfGenerator("<h1>Hello, World from Class!</h1>");
        generator.GeneratePdf("ClassExample.pdf");
    }
}
using IronPdf;
using System;

public class PdfGenerator
{
    public string HtmlContent { get; set; }

    public PdfGenerator(string htmlContent)
    {
        HtmlContent = htmlContent;
    }

    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key"; // Set your license key here

        var generator = new PdfGenerator("<h1>Hello, World from Class!</h1>");
        generator.GeneratePdf("ClassExample.pdf");
    }
}
Imports IronPdf
Imports System

Public Class PdfGenerator
	Public Property HtmlContent() As String

	Public Sub New(ByVal htmlContent As String)
		Me.HtmlContent = htmlContent
	End Sub

	Public Sub GeneratePdf(ByVal filePath As String)
		Dim renderer = New ChromePdfRenderer()
		Dim pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent)
		pdfDocument.SaveAs(filePath)
	End Sub
End Class

Friend Class Program
	Public Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "License-Key" ' Set your license key here

		Dim generator = New PdfGenerator("<h1>Hello, World from Class!</h1>")
		generator.GeneratePdf("ClassExample.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

Saída:

PDF gerado a partir do exemplo de classe

Usando um registro

Em contraste, um registro em C# é imutável após a inicialização. Eis como você poderia obter um resultado semelhante com um registro, utilizando expressões with para modificações, que essencialmente retornam uma nova instância do registro com as alterações desejadas.

using IronPdf;
using System;

public record PdfGeneratorRecord(string HtmlContent)
{
    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this.HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key"; // Set your license key here

        var recordGenerator = new PdfGeneratorRecord("<h1>Hello, World from Record!</h1>");
        recordGenerator.GeneratePdf("RecordExample.pdf");
    }
}
using IronPdf;
using System;

public record PdfGeneratorRecord(string HtmlContent)
{
    public void GeneratePdf(string filePath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this.HtmlContent);
        pdfDocument.SaveAs(filePath);
    }
}

class Program
{
    public static void Main(string[] args)
    {
        License.LicenseKey = "License-Key"; // Set your license key here

        var recordGenerator = new PdfGeneratorRecord("<h1>Hello, World from Record!</h1>");
        recordGenerator.GeneratePdf("RecordExample.pdf");
    }
}
Imports IronPdf
Imports System

'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record PdfGeneratorRecord(string HtmlContent)
'{
'	public void GeneratePdf(string filePath)
'	{
'		var renderer = New ChromePdfRenderer();
'		var pdfDocument = renderer.RenderHtmlAsPdf(Me.HtmlContent);
'		pdfDocument.SaveAs(filePath);
'	}
'}

Friend Class Program
	Public Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "License-Key" ' Set your license key here

		Dim recordGenerator = New PdfGeneratorRecord("<h1>Hello, World from Record!</h1>")
		recordGenerator.GeneratePdf("RecordExample.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

Saída:

PDF gerado a partir do exemplo de registro

Estes exemplos ilustram como gerar um arquivo PDF usando o IronPDF com uma classe e um registro em C#. A escolha entre usar uma classe ou um registro depende das suas necessidades específicas: se você precisa de objetos que serão modificados após a criação, uma classe pode ser mais apropriada. Se você estiver lidando com dados que não devem ser alterados após sua criação, ou se você valoriza a simplicidade sintática e a segurança da imutabilidade, um registro pode ser a melhor escolha.

Conclusão

 Página de licenciamento do IronPDF

Em conclusão, as classes oferecem recursos tradicionais de orientação a objetos, como estado mutável e igualdade baseada em referência, enquanto os registros fornecem uma abordagem moderna para definir estruturas de dados imutáveis ​​com igualdade baseada em valor.

A escolha entre usar uma classe ou um registro deve ser guiada pelos requisitos específicos da sua aplicação, considerando fatores como a necessidade de imutabilidade, a complexidade da estrutura de dados e o método preferido de comparação de igualdade. Descubra a versão de avaliação gratuita do IronPDF para quem deseja integrar a funcionalidade de PDF em seus aplicativos .NET , com licenças a partir de $799.

Perguntas frequentes

Quais são as principais diferenças entre classes e registros em C#?

Classes e registros em C# são ambos tipos de referência usados para modelar e encapsular dados, mas diferem na forma como lidam com igualdade e imutabilidade. Classes usam igualdade por referência, o que significa que duas instâncias são consideradas iguais se apontarem para o mesmo endereço de memória. Por outro lado, registros usam igualdade por valor, considerando duas instâncias iguais se suas propriedades tiverem os mesmos valores, e são projetados para serem imutáveis por padrão.

Como posso decidir se devo usar uma classe ou um registro em C#?

A escolha entre usar uma classe ou um registro em C# depende dos seus requisitos específicos. Use uma classe se precisar de instâncias mutáveis ou se quiser encapsular dados e comportamentos típicos da programação orientada a objetos. Opte por um registro se a sua estrutura for simples, imutável e você precisar de igualdade baseada em valores, como em objetos de transferência de dados.

Como a biblioteca IronPDF oferece suporte à geração de PDFs em .NET?

IronPDF é uma biblioteca robusta for .NET que simplifica a criação, edição e gerenciamento de documentos PDF. Ela permite que desenvolvedores convertam HTML, CSS, JavaScript e imagens em PDFs, com suporte a diversas estruturas .NET e sistemas operacionais, tornando-se uma ferramenta essencial para desenvolvedores .NET.

Posso usar tanto classes C# quanto registros em projetos de geração de PDF?

Sim, tanto classes C# quanto registros podem ser usados em projetos de geração de PDF. A escolha depende se você precisa de estruturas de dados mutáveis ou imutáveis para sua lógica. Por exemplo, o IronPDF funciona perfeitamente com qualquer uma das estruturas para gerar e manipular PDFs.

Qual o papel da imutabilidade nos registros em C#?

A imutabilidade é uma característica fundamental dos registros em C#. Uma vez criados, as propriedades de um registro não podem ser alteradas, o que está em consonância com a semântica de igualdade baseada em valores. Esse design torna os registros ideais para cenários em que a consistência e a integridade dos dados são críticas, como em objetos de transferência de dados.

Como o IronPDF aprimora as funcionalidades de PDF para aplicativos .NET?

O IronPDF aprimora as funcionalidades de PDF para aplicações .NET, fornecendo recursos como conversão de HTML para PDF, edição de PDFs e gerenciamento de segurança de documentos. Ele oferece suporte ao trabalho com formulários, extração de conteúdo e integração perfeita em diferentes ambientes .NET, simplificando assim o processamento de documentos PDF.

Qual é a expressão 'with' no contexto de registros C#?

A expressão 'with' em registros C# é usada para mutação não destrutiva. Ela permite que os desenvolvedores criem uma nova instância de registro copiando uma existente, mas com algumas propriedades modificadas, garantindo que os dados originais permaneçam inalterados.

Por que os registros são considerados adequados para objetos de transferência de dados?

Os registros são considerados adequados para objetos de transferência de dados porque fornecem uma sintaxe concisa para definir estruturas imutáveis com igualdade baseada em valores. Isso garante a manutenção da integridade dos dados e que instâncias com valores idênticos sejam tratadas como iguais, o que é frequentemente desejado em cenários de transferência de dados.

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