C# Record Vs Class (Cómo Funciona para Desarrolladores)
En el mundo de C#, se utilizan dos estructuras principales para modelar y encapsular datos: clases y registros. Ambos sirven como tipos de referencia pero difieren significativamente en su uso previsto, comportamiento y cómo manejan la igualdad. Esta guía diseccionará estas diferencias, proporcionando ejemplos claros y usos prácticos para ayudar a los desarrolladores a elegir la estructura adecuada para sus necesidades. También aprenderemos sobre la biblioteca IronPDF.
Clases en C#: Lo básico
Las clases han sido un pilar de la programación orientada a objetos en C#, diseñadas para encapsular datos y comportamiento. Son tipos de referencia, lo que significa que dos instancias de una clase con los mismos valores se consideran dos objetos separados. Esta distinción es crucial al comparar dos instancias de clase; la comparación por defecto se basa en la referencia, no en el 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; }
}En el ejemplo anterior, Person es una clase con propiedades Id y FullName. Incluso si dos instancias de Person tienen valores idénticos de Id y FullName, por defecto no se consideran iguales porque son dos referencias diferentes en memoria.
Records en C#: Estructuras de datos inmutables
Introducido en C#, el tipo de registro es una nueva adición destinada a simplificar la creación de estructuras de datos inmutables, proporcionando una alternativa robusta a las estructuras de clase tradicionales. A diferencia de las clases, los registros ofrecen semánticas de igualdad basadas en el valor, lo que los hace ideales para objetos de transferencia de datos o pequeñas estructuras de datos con poco o ningún comportamiento.
public record Person(int Id, string FullName);public record Person(int Id, string FullName);En el ejemplo anterior, la definición de registro es más concisa, reduciendo el código repetitivo. Los registros admiten automáticamente la mutación no destructiva y la comparación basada en valores. Dos instancias de registro con los mismos valores se consideran iguales, alineándose con las semánticas de valor.
Usos prácticos: Cuándo usar Record vs. Class
Elegir entre una clase y un registro, u otras estructuras de datos en C#, depende de la complejidad de los datos que estás modelando y los comportamientos requeridos por tu aplicación. Las clases están diseñadas específicamente para estructuras de datos complejas, acomodando comportamientos (métodos) y permitiendo instancias mutables según sea necesario. Los registros, por otro lado, son ejemplos perfectos de una estructura de datos simple, diseñados con características inmutables y igualdad basada en el valor, ideales para datos que permanecen constantes después de la creación.
Las clases son ideales cuando tu estructura de datos requiere encapsular datos y comportamientos o cuando necesitas manipular los datos después de su creación. Esta flexibilidad hace que las clases sean una referencia para la mayoría de escenarios tradicionales de programación orientada a objetos y cuando se crean estructuras de datos complejas.
Los registros brillan en escenarios donde la inmutabilidad de los datos es crucial o cuando estás lidiando con estructuras de datos simples que principalmente sirven como contenedores de datos. Su igualdad basada en valores incorporada y su sintaxis concisa los hacen excelentes para objetos de transferencia de datos u objetos de valor.
Tipos de valor y tipos de referencia
Entender la diferencia entre tipo de valor y tipo de referencia en C# es vital. Las clases son tipos de referencia, lo que significa que las variables tienen una referencia a los datos reales en la memoria. Esta característica conduce a la comparación de igualdad por referencia de forma predeterminada.
Los registros, aunque también son tipos de referencia, emulan semánticas de valor a través de su igualdad basada en valores incorporada, haciéndolos comportarse algo así como tipos de valor en las comparaciones.
Ejemplos de código: Implementación de clases y registros
Vamos a implementar una clase y un registro para resaltar las diferencias en sintaxis y comportamiento.
Implementación de Clase:
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;
}
}Implementación de Registro:
public record Product(int Id, string Name);public record Product(int Id, string Name);Observe la brevedad y simplicidad de la implementación del registro. El registro genera automáticamente el constructor, las propiedades y los métodos para la igualdad basada en valores.
Entendiendo la igualdad: Referencia vs. Valor
La diferencia central entre tipos de clase y registro en C# radica en cómo manejan la igualdad:
Las clases usan igualdad de referencia por defecto, lo que significa que dos instancias son iguales si apuntan a la misma ubicación de memoria.
- Los registros usan igualdad de valor por defecto, considerando dos instancias iguales si sus propiedades tienen los mismos valores.
Ejemplo de Igualdad de Referencia (Clase)
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: Falsepublic 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: FalseDos instancias de una clase con los mismos valores de propiedad no se consideran iguales porque son objetos diferentes en memoria.
Ejemplo de Igualdad de Valor
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: Truepublic 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: TrueDos instancias de un registro con los mismos valores de propiedad se consideran iguales por defecto.
Características avanzadas: Registros
Los registros vienen con varias características avanzadas que satisfacen la necesidad de estructuras de datos inmutables y igualdad basada en valores. La expresión with permite crear una nueva instancia de registro copiando un registro existente pero con algunas propiedades modificadas, demostrando la mutación no destructiva.
Mutación No Destructiva con 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" };Esta característica es útil cuando se trabaja con estructuras de datos inmutables, ya que proporciona una manera de "modificar" una instancia sin alterar los datos originales.
Introducción a la biblioteca IronPDF

IronPDF es una biblioteca PDF para desarrolladores de .NET, ofreciendo una solución integral para crear, editar y gestionar documentos PDF directamente dentro de aplicaciones .NET. Simplifica el proceso de generación de PDF permitiendo a los desarrolladores convertir HTML en PDFs, CSS, JavaScript e imágenes en PDFs. IronPDF soporta una variedad de marcos y tipos de proyectos .NET, incluidas aplicaciones web, de escritorio y de consola, en múltiples sistemas operativos como Windows, Linux y macOS.
Más allá de la creación de PDFs, IronPDF proporciona capacidades para editar PDFs, configurar propiedades y seguridad, trabajar con formularios PDF y extraer contenido. Está diseñado para satisfacer las necesidades de los desarrolladores que buscan una herramienta confiable para integrar la funcionalidad PDF en sus proyectos .NET.
Ejemplo de código
Crear un PDF en C# usando IronPDF se puede lograr tanto con clases como con registros. A continuación se presentan ejemplos de ambos enfoques para generar un documento PDF simple. La principal diferencia entre clases y registros en C# radica en su uso previsto: las clases son mutables por defecto y están diseñadas para programación orientada a objetos tradicional, mientras que los registros son inmutables y están diseñados para programación basada en valores, haciéndolos ideales para modelado de datos.
Uso de una clase
En este ejemplo, definiremos una clase PdfGenerator que contiene un método para crear un PDF a partir de una cadena HTML dada.
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");
}
}Producción:

Uso de un registro
En contraste, un registro en C# es inmutable después de la inicialización. Aquí está cómo podrías lograr un resultado similar con un registro, utilizando expresiones with para modificaciones, que esencialmente devuelven una nueva instancia del registro con los cambios deseados.
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");
}
}Producción:

Estos ejemplos ilustran cómo generar un archivo PDF usando IronPDF con tanto una clase como un registro en C#. La elección entre usar una clase o un registro depende de tus necesidades específicas: si necesitas objetos que van a ser modificados después de la creación, una clase podría ser más apropiada. Si estás tratando con datos que no deberían cambiar una vez que han sido creados o aprecias la simplicidad sintáctica y seguridad de la inmutabilidad, un registro podría ser la mejor opción.
Conclusión

En conclusión, las clases ofrecen características tradicionales orientadas a objetos con estado mutable e igualdad basada en referencia, mientras que los registros proporcionan un enfoque moderno para definir estructuras de datos inmutables con igualdad basada en valores.
La elección entre usar una clase o un registro debe estar guiada por los requisitos específicos de tu aplicación, considerando factores como la necesidad de inmutabilidad, la complejidad de la estructura de datos y el método preferido de comparación de igualdad. Descubre la Prueba Gratuita de IronPDF para aquellos que buscan integrar funcionalidad PDF en sus aplicaciones .NET, con licencias desde $799.
Preguntas Frecuentes
¿Cuáles son las principales diferencias entre las clases y los registros en C#?
Las clases y los registros de C# son ambos tipos de referencia utilizados para modelar y encapsular datos, pero difieren en cómo manejan la igualdad y la inmutabilidad. Las clases utilizan igualdad de referencia, lo que significa que dos instancias se consideran iguales si apuntan a la misma ubicación de memoria. Por otro lado, los registros utilizan igualdad de valor, considerando iguales dos instancias si sus propiedades tienen los mismos valores, y están diseñados para ser inmutables por defecto.
¿Cómo puedo decidir si usar una clase o un registro en C#?
La elección entre usar una clase o un registro en C# depende de tus requisitos específicos. Usa una clase si necesitas instancias mutables o quieres encapsular datos y comportamientos típicos en la programación orientada a objetos. Opta por un registro si tu estructura es simple, inmutable y requieres igualdad basada en valores, como en los objetos de transferencia de datos.
¿Cómo la biblioteca IronPDF soporta la generación de PDF en .NET?
IronPDF es una robusta biblioteca de PDF para .NET que simplifica la creación, edición y gestión de documentos PDF. Permite a los desarrolladores convertir HTML, CSS, JavaScript e imágenes a PDF, soportando varios frameworks de .NET y sistemas operativos, convirtiéndola en una herramienta esencial para desarrolladores de .NET.
¿Puedo usar tanto clases como registros de C# en proyectos de generación de PDF?
Sí, tanto las clases como los registros de C# se pueden utilizar en proyectos de generación de PDF. La elección depende de si necesitas estructuras de datos mutables o inmutables para tu lógica. Por ejemplo, IronPDF puede trabajar perfectamente con cualquiera de las estructuras para generar y manipular PDF.
¿Qué papel juega la inmutabilidad en los registros de C#?
La inmutabilidad es una característica central de los registros de C#. Una vez creados, las propiedades de un registro no pueden cambiarse, lo cual se alinea con la semántica de la igualdad basada en valores. Este diseño hace que los registros sean ideales para escenarios donde la consistencia e integridad de los datos son críticas, como en los objetos de transferencia de datos.
¿Cómo mejora IronPDF las funcionalidades de PDF para aplicaciones .NET?
IronPDF mejora las funcionalidades de PDF para aplicaciones .NET al ofrecer características como la conversión de HTML a PDF, edición de PDFs y gestión de la seguridad del documento. Soporta trabajar con formularios, extraer contenido e integrarse perfectamente en distintos entornos .NET, simplificando así el procesamiento de documentos PDF.
¿Qué es la expresión 'with' en el contexto de los registros de C#?
La expresión 'with' en los registros de C# se utiliza para la mutación no destructiva. Permite a los desarrolladores crear una nueva instancia de registro copiando una ya existente pero con algunas propiedades modificadas, asegurando que los datos originales permanezcan sin cambios.
¿Por qué los registros son adecuados para objetos de transferencia de datos?
Los registros se consideran adecuados para los objetos de transferencia de datos porque ofrecen una sintaxis concisa para definir estructuras inmutables con igualdad basada en valores. Esto asegura que la integridad de los datos se mantenga y que las instancias con valores idénticos se traten como iguales, lo cual suele ser deseado en escenarios de transferencia de datos.








