csharp-tipo-record

El tipo record en C#

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, 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 un record con dos propiedades: Nombre y Edad.
  • 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("Juan", 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.