El tipo record es una característica introducida en C# 9.0 que permite definir un tipo de referencia que se centra en la inmutabilidad y la igualdad estructural.
A diferencia de las clases tradicionales, los record
están diseñados para representar datos y no comportamientos. Esto les hace adecuados para modelar datos, por ejemplo.
Características clave de los tipos Record
Inmutabilidad por defecto: Los tipos record
son inmutables por defecto, lo que significa que sus propiedades se establecen una vez al momento de la creación y no se pueden modificar posteriormente.
Igualdad estructural: Los tipos record
implementan la igualdad estructural, lo que significa que dos instancias de un record
se consideran iguales si sus propiedades tienen los mismos valores, a diferencia de la igualdad de referencia que se aplica a las clases.
Desestructuración: Los tipos record
soportan la desestructuración, lo que permite extraer valores de un record
en variables individuales de forma sencilla.
Patrones de coincidencia: Los record
permiten patrones de coincidencia que facilitan la comparación de valores y la extracción de datos en operaciones de coincidencia de patrones.
Cómo usar record
Definición de un record
Para definir un tipo record
, se utiliza la palabra clave record
seguida del nombre del tipo y la lista de propiedades. A continuación se muestra un ejemplo básico:
public record Persona(string Nombre, int Edad);
En este ejemplo,
Persona
es unrecord
con dos propiedades:Nombre
yEdad
.- El constructor, las propiedades y los métodos de igualdad son generados automáticamente por el compilador.
Acceso a las propiedades
El acceso a las propiedades de un record
se realiza de forma directa, como en las clases:
Console.WriteLine(persona.Nombre); // Salida: Ana
Console.WriteLine(persona.Edad); // Salida: 30
Igualdad estructural
Dos instancias de un record
son iguales si sus propiedades tienen los mismos valores:
var persona1 = new Persona("Ana", 30);
var persona2 = new Persona("Ana", 30);
var persona3 = new Persona("Luis", 25);
Console.WriteLine(persona1 == persona2); // Salida: True
Console.WriteLine(persona1 == persona3); // Salida: False
Los record
sobrescriben automáticamente los métodos Equals
y GetHashCode
para proporcionar igualdad estructural.
Inmutabilidad
Por defecto, las propiedades de un record
son inmutables. Esto significa que no se pueden modificar una vez que se ha creado la instancia.
var producto = new Producto("Tablet", 300.00m);
// producto.Precio = 250.00m; // Error de compilación: no se puede modificar una propiedad de solo lectura
Desestructuración
Puedes desestructurar un record
en sus componentes individuales utilizando la sintaxis de desestructuración:
var (nombre, edad) = persona;
Console.WriteLine($"Nombre: {nombre}, Edad: {edad}"); // Salida: Nombre: Ana, Edad: 30
Copia con modificación
Aunque los record
son inmutables, se puede crear una copia de un record
con algunas modificaciones utilizando la expresión with
.
var producto = new Producto("Monitor", 200.00m);
var productoModificado = producto with { Precio = 180.00m };
Console.WriteLine(productoModificado.Precio); // Imprime 180.00
Herencia de Record
Los record
también soportan herencia, lo que permite crear una jerarquía de record
:
public record Empleado(string Nombre, int Edad, string Cargo) : Persona(Nombre, Edad);
En este ejemplo, Empleado
hereda de Persona
y agrega una propiedad adicional Cargo
. La herencia en record
permite reutilizar propiedades y comportamientos, manteniendo la inmutabilidad y la igualdad estructural.
Patrones de coincidencia
Los record
permiten utilizar patrones de coincidencia para comparar valores y extraer datos:
public void MostrarPersona(Persona persona)
{
if (persona is Persona { Edad: >= 18 } adulto)
{
Console.WriteLine($"{adulto.Nombre} es un adulto.");
}
else
{
Console.WriteLine($"{persona.Nombre} no es un adulto.");
}
}
En este ejemplo, el patrón de coincidencia { Edad: >= 18 }
verifica si la propiedad Edad
es mayor o igual a 18 y extrae la instancia en una variable adulto
si es verdadero.