Structs: semántica de valor y patrón de inmutabilidad
Comprenda la semántica de valor de los struct en C# 6 y cree un patrón de struct inmutable (copiar al cambiar).
Structs: semántica de valor y patrón de inmutabilidad es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 1 de 3. 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 3 lecciones en total.
Descripción general de los structs
Objetivo: usar structs de forma segura.
- Semántica de valor (se copian al asignar)
- Patrón de struct inmutable en C# 6
- Pasar por valor frente a pasar por referencia
- Nota sobre boxing
Semántica de copia
Los structs son tipos de valor: la asignación crea una copia. Cambiar la copia no cambia el original.
using System;
// Simple struct with public fields for demo (okay for small POD data)
public struct Point
{
public int X;
public int Y;
}
public class Program
{
public static void Main(string[] args)
{
Point a = new Point();
a.X = 1; a.Y = 2;
Point b = a; // copy the value
b.X = 9; // change the copy
Console.WriteLine("a=(" + a.X + "," + a.Y + ")");
Console.WriteLine("b=(" + b.X + "," + b.Y + ")"); // different from a
}
}
Patrón de struct inmutable
Prefiera los structs inmutables: campos readonly, un constructor para el estado obligatorio y pequeños auxiliares With para crear valores nuevos.
using System;
// Immutable struct pattern (C# 6): readonly fields + constructor + With method
public struct Money
{
private readonly decimal _amount;
private readonly string _currency;
public decimal Amount { get { return _amount; } }
public string Currency { get { return _currency; } }
public Money(decimal amount, string currency)
{
_amount = amount;
_currency = currency ?? "USD";
}
// Copy-on-change: returns a new value with updated amount
public Money WithAmount(decimal amount)
{
return new Money(amount, _currency);
}
}
public class Program
{
public static void Main(string[] args)
{
Money m1 = new Money(10m, "USD");
Money m2 = m1.WithAmount(15m); // new value
Console.WriteLine("m1: " + m1.Amount + " " + m1.Currency);
Console.WriteLine("m2: " + m2.Amount + " " + m2.Currency);
}
}
Por valor frente a por referencia
De forma predeterminada, los métodos reciben una copia. Use ref para modificar el struct del llamador.
using System;
public struct Counter
{
public int Value;
}
public class Program
{
static void IncrementByValue(Counter c)
{
c.Value = c.Value + 1; // changes only the local copy
}
static void IncrementByRef(ref Counter c)
{
c.Value = c.Value + 1; // changes the caller's variable
}
public static void Main(string[] args)
{
Counter a = new Counter();
IncrementByValue(a);
Console.WriteLine("After by-value: " + a.Value); // 0
IncrementByRef(ref a);
Console.WriteLine("After by-ref: " + a.Value); // 1
}
}
Conceptos básicos de boxing
Boxing copia un struct en una referencia a objeto o interfaz. Unboxing crea otra copia.
using System;
public interface IShow { string Show(); }
public struct Temperature : IShow
{
public int C;
public string Show() { return C + "C"; }
}
public class Program
{
public static void Main(string[] args)
{
Temperature t = new Temperature();
t.C = 25;
object boxed = t; // boxing: copy into object
Temperature copy = (Temperature)boxed; // unbox (another copy)
copy.C = 30;
Console.WriteLine("t = " + t.C); // 25
Console.WriteLine("copy = " + copy.C); // 30
}
}
Consejos sobre structs
Consejos:
- Use structs para objetos de valor pequeños e inmutables (coordenadas, dinero).
- Evite los structs grandes o muy mutables.
- Recuerde que se crean copias al asignar y al pasar por valor.
- Tenga en cuenta el boxing al convertir a object o interface.
Semántica de valor de un struct
Repaso
Repaso: los structs son tipos de valor. Prefiera diseños pequeños e inmutables (constructor + campos readonly + With). Sepa cómo afectan a las copias el paso por valor frente a ref y el boxing.
Preguntas frecuentes
¿La lección «Structs: semántica de valor y patrón de inmutabilidad» es gratis?
Sí — el texto completo de «Structs: semántica de valor y patrón de inmutabilidad» 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 3 lecciones en total.
¿Qué aprenderé en «Structs: semántica de valor y patrón de inmutabilidad»?
Comprenda la semántica de valor de los struct en C# 6 y cree un patrón de struct inmutable (copiar al cambiar). 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 1 de 3.
¿Cuánto tiempo toma la lección «Structs: semántica de valor y patrón de inmutabilidad»?
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
- Structs: semántica de valor y patrón de inmutabilidad
- Tipos similares a records e igualdad basada en valores (patrón)
- Enums y [Flags]