Setters de solo inicialización con init
Cree propiedades que solo puedan establecerse durante la inicialización.
Setters de solo inicialización con init es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 1 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.
Asignadores init-only
Un accesor init permite establecer una propiedad durante la construcción del objeto, incluidos los inicializadores de objetos, pero la convierte en solo lectura después. La forma es { get; init; }.
using System;
class Point {
public int X { get; init; }
public int Y { get; init; }
}
var p = new Point { X = 3, Y = 4 };
Console.WriteLine(p.X + "," + p.Y); // 3,4Asignación únicamente durante la inicialización
Una vez creado el objeto, asignar un valor a una propiedad init produce un error de compilación, lo que garantiza la inmutabilidad después de la construcción.
using System;
class Config {
public string Name { get; init; }
}
var c = new Config { Name = "prod" };
// c.Name = "dev"; // compile error
Console.WriteLine(c.Name); // prodLos inicializadores de objetos siguen funcionando
La gran ventaja frente a una propiedad de solo lectura con un accesor get-only es que init admite la sintaxis de inicializador de objetos, por lo que no necesita un constructor para cada propiedad.
using System;
class Settings {
public bool DarkMode { get; init; }
public int FontSize { get; init; }
}
var s = new Settings { DarkMode = true, FontSize = 14 };
Console.WriteLine(s.DarkMode + " " + s.FontSize); // True 14Combinación con constructores
Puede establecer propiedades init desde un constructor y permitir también que los inicializadores las sobrescriban.
using System;
class User {
public string Role { get; init; } = "guest";
public User() { }
}
var u = new User { Role = "admin" };
Console.WriteLine(u.Role); // adminValores predeterminados
Las propiedades init pueden tener inicializadores predeterminados que se aplican salvo que se sobrescriban durante la construcción.
using System;
class Options {
public int Retries { get; init; } = 3;
}
Console.WriteLine(new Options().Retries); // 3
Console.WriteLine(new Options { Retries = 5 }.Retries); // 5init frente a set
Un accesor set permite modificar el valor en cualquier momento; init restringe la asignación a la fase de construcción. Elija init para los datos que deban ser inmutables después de su creación.
using System;
class Mutable { public int V { get; set; } }
class Frozen { public int V { get; init; } }
var m = new Mutable { V = 1 };
m.V = 2; // allowed
Console.WriteLine(m.V); // 2init con validación
Puede implementar un cuerpo explícito de init con un campo de respaldo para validar el valor asignado.
using System;
class Percentage {
private int _value;
public int Value {
get => _value;
init => _value = (value < 0 || value > 100)
? throw new ArgumentOutOfRangeException()
: value;
}
}
Console.WriteLine(new Percentage { Value = 80 }.Value); // 80init en records
Las propiedades posicionales de los records solo admiten init de forma predeterminada, por lo que los records son inmutables y, al mismo tiempo, admiten copias con with.
using System;
record Account(string Id, decimal Balance);
var a = new Account("A1", 100m);
Console.WriteLine(a.Balance); // 100Inicializadores de objetos anidados
init funciona con inicializadores de objetos anidados, lo que permite crear grafos complejos e inmutables en una sola expresión.
using System;
class Address { public string City { get; init; } }
class Person { public string Name { get; init; } public Address Home { get; init; } }
var p = new Person { Name = "Lin", Home = new Address { City = "Oslo" } };
Console.WriteLine(p.Name + " / " + p.Home.City); // Lin / Osloinit y herencia
Las clases derivadas pueden establecer propiedades init de la clase base mediante inicializadores de objetos, ya que la fase de construcción abarca todo el objeto.
using System;
class Base { public int Id { get; init; } }
class Item : Base { public string Name { get; init; } }
var i = new Item { Id = 1, Name = "Pen" };
Console.WriteLine(i.Id + " " + i.Name); // 1 PenIntegración
Un DTO inmutable creado completamente con propiedades init y un inicializador de objetos.
using System;
class OrderDto {
public int Id { get; init; }
public string Customer { get; init; }
public decimal Amount { get; init; }
}
var o = new OrderDto { Id = 7, Customer = "Ada", Amount = 49.9m };
Console.WriteLine(o.Id + " " + o.Customer + " " + o.Amount); // 7 Ada 49.9Comprobación rápida
Compruebe cuánto domina los asignadores init-only.
Resumen
Ha aprendido a utilizar asignadores init-only.
{ get; init; }permite asignar valores únicamente durante la construcción.- Los inicializadores de objetos funcionan con propiedades
init. - Puede añadir validación mediante un cuerpo explícito de
init. - Las propiedades posicionales de los records son
initde forma predeterminada.
Preguntas frecuentes
¿La lección «Setters de solo inicialización con init» es gratis?
Sí — el texto completo de «Setters de solo inicialización con init» 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 «Setters de solo inicialización con init»?
Cree propiedades que solo puedan establecerse durante la inicialización. 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 4.
¿Cuánto tiempo toma la lección «Setters de solo inicialización con init»?
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
- Setters de solo inicialización con init
- El modificador required
- Patrones de objetos inmutables
- Expresiones with en records