C# Academy · Lección

Expresiones with en records

Cree copias modificadas de objetos inmutables.

Lección 4 de 413 pasos

Expresiones with en records es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

La expresión with

Una expresión with crea una copia de un record con algunas propiedades modificadas y deja intacto el original. Es la forma idiomática de «actualizar» records inmutables.

using System;

record Point(int X, int Y);

var a = new Point(1, 2);
var b = a with { Y = 9 };
Console.WriteLine(a + " | " + b); // Point { X = 1, Y = 2 } | Point { X = 1, Y = 9 }

Mutación no destructiva

El record original nunca se modifica. with realiza una copia superficial y aplica los cambios indicados únicamente a la copia.

using System;

record User(string Name, int Age);

var original = new User("Ada", 30);
var older = original with { Age = 31 };
Console.WriteLine(original.Age + " " + older.Age); // 30 31

Cambio de varias propiedades

Incluya varias asignaciones dentro de las llaves para cambiar más de una propiedad a la vez.

using System;

record Config(string Env, int Retries, bool Verbose);

var baseCfg = new Config("dev", 3, false);
var prod = baseCfg with { Env = "prod", Verbose = true };
Console.WriteLine(prod.Env + " " + prod.Retries + " " + prod.Verbose); // prod 3 True

Copiar propiedades sin cambios

Las propiedades que no mencione se copian tal cual del registro de origen.

using System;

record Product(string Name, decimal Price, int Stock);

var p = new Product("Book", 12m, 5);
var discounted = p with { Price = 10m };
Console.WriteLine(discounted.Name + " " + discounted.Stock); // Book 5

with y la igualdad por valor

Como los registros utilizan igualdad por valor, una copia que no cambia nada es igual al original.

using System;

record Coord(int X, int Y);

var a = new Coord(1, 2);
var b = a with { };
Console.WriteLine(a == b);         // True (value equal)
Console.WriteLine(ReferenceEquals(a, b)); // False (different objects)

Semántica de copia superficial

with copia referencias, no grafos de objetos completos. Un objeto mutable anidado se comparte entre el original y la copia.

using System;
using System.Collections.Generic;

record Cart(List<string> Items);

var a = new Cart(new List<string> { "x" });
var b = a with { };
b.Items.Add("y"); // shared list!
Console.WriteLine(a.Items.Count); // 2

with en record structs

Los record structs también admiten with, que produce una copia modificada del tipo de valor.

using System;

record struct Size(int W, int H);

var s = new Size(4, 4);
var wide = s with { W = 8 };
Console.WriteLine(wide.W + "x" + wide.H); // 8x4

Encadenar expresiones with

Puede encadenar expresiones with para aplicar una secuencia de cambios, donde cada una produce un registro nuevo.

using System;

record Point(int X, int Y, int Z);

var p = new Point(0, 0, 0)
    with { X = 1 }
    with { Y = 2 }
    with { Z = 3 };
Console.WriteLine(p); // Point { X = 1, Y = 2, Z = 3 }

Actualizaciones sin builders

with elimina la necesidad de clases builder: solo tiene que copiar y ajustar los campos que desee.

using System;

record Email(string To, string Subject, string Body);

var draft = new Email("a@b.com", "Hi", "");
var ready = draft with { Body = "Welcome!" };
Console.WriteLine(ready.Body); // Welcome!

Lógica de copia personalizada

Los records generan un constructor de copia protegido que utiliza with. Puede declarar uno propio para personalizar cómo se realizan las copias.

using System;

record Audited(string Name) {
    public int Version { get; init; } = 1;
    protected Audited(Audited other) {
        Name = other.Name;
        Version = other.Version + 1; // bump on every copy
    }
}

var a = new Audited("x");
var b = a with { };
Console.WriteLine(a.Version + " " + b.Version); // 1 2

Integración

Modelar transiciones de estado con with mantiene un historial inmutable y fácil de auditar.

using System;

record Order(string Id, string Status);

var created = new Order("O1", "Created");
var paid = created with { Status = "Paid" };
var shipped = paid with { Status = "Shipped" };
Console.WriteLine(created.Status + " -> " + paid.Status + " -> " + shipped.Status);

Comprobación rápida

Compruebe su comprensión de las expresiones with.

Resumen

Ha aprendido las expresiones with de los records.

  • a with { Prop = value } copia y cambia las propiedades seleccionadas.
  • El original nunca se modifica; la operación no es destructiva.
  • La copia es superficial, por lo que los objetos mutables anidados se comparten.
  • Funciona con records y record structs, y se puede encadenar.
Gratis para empezar

Aprende C# con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
93
Lecciones
346

Preguntas frecuentes

¿La lección «Expresiones with en records» es gratis?

Sí — el texto completo de «Expresiones with en records» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Expresiones with en records»?

Cree copias modificadas de objetos inmutables. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Expresiones with en records»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Setters de solo inicialización con init
  2. El modificador required
  3. Patrones de objetos inmutables
  4. Expresiones with en records
← Volver a C# Academy