
Palabra Clave Init de C# (Cómo Funciona para Desarrolladores)
La palabra clave init en C# 9.0 introdujo una nueva forma de definir propiedades de clase para crear objetos inmutables. En versiones anteriores de C#, las propiedades se usaban generalmente con los accesores get y set para leer y escribir en los campos de los objetos. Sin embargo, con init, puedes hacer que las propiedades sean editables solo durante la inicialización del objeto, haciéndolas de solo lectura después.
Este tutorial explorará el uso de la palabra clave init de C# con ejemplos prácticos y escenarios usando la biblioteca IronPDF. También aprenderás sobre las diferencias críticas entre los setters de propiedades tradicionales (set) y los nuevos setters solo de init.
Ejemplo básico de la palabra clave Init
Comencemos con un ejemplo básico:
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
var person = new Person
{
FirstName = "Iron",
LastName = "Dev"
};
// person.FirstName = "Jane"; // This will give a compile-time error.Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
End Class
Private person = New Person With {
.FirstName = "Iron",
.LastName = "Dev"
}
' person.FirstName = "Jane"; // This will give a compile-time error.
En este ejemplo, FirstName y LastName están marcadas como propiedades de solo inicialización. Esto significa que solo pueden asignarse durante la inicialización del objeto. Después de que se crea el objeto, intentar cambiar los valores causará un error en tiempo de compilación.
¿Por qué usar la palabra clave Init?
La razón principal para usar la palabra clave init es hacer que las propiedades de un objeto sean inmutables después de la inicialización. Tradicionalmente, podrías marcar las propiedades como de solo lectura para lograr inmutabilidad. Sin embargo, a menudo necesitarías un constructor que acepte todos los valores necesarios para establecer los campos, lo que puede llevar a código redundante en el constructor. Con init, puedes lograr el mismo objetivo utilizando inicializadores de objetos sin escribir constructores largos.
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
// Without using constructor boilerplate for property initialization
}
var person = new Person
{
FirstName = "John",
LastName = "Doe"
};Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
' Without using constructor boilerplate for property initialization
End Class
Private person = New Person With {
.FirstName = "John",
.LastName = "Doe"
}Inicialización de objetos con propiedades Init-Only
El uso de init funciona perfectamente con los inicializadores de objetos. En lugar de depender de constructores para establecer valores, puedes definir directamente las propiedades que necesitas mientras creas un objeto.
public class Point
{
public int X { get; init; }
public int Y { get; init; }
}
var point = new Point { X = 10, Y = 20 };
// point.X = 30; // This will throw a compile-time errorPublic Class Point
Public Property X() As Integer
Public Property Y() As Integer
End Class
Private point = New Point With {
.X = 10,
.Y = 20
}
' point.X = 30; // This will throw a compile-time errorEsto crea un objeto simple e inmutable del tipo Point. Observe que los valores para X y Y se establecen en la inicialización y no pueden modificarse posteriormente.
Mezclar init con constructores
Aunque el caso de uso principal de init es la inicialización de objetos a través de inicializadores de objetos, todavía puedes usar un constructor si es necesario. Esto es particularmente útil cuando se imponen valores de propiedades específicas durante la creación del objeto.
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
Public Sub New(ByVal firstName As String, ByVal lastName As String)
Me.FirstName = firstName
Me.LastName = lastName
End Sub
End ClassPuedes usar tanto constructores como propiedades init juntas. Este enfoque ofrece más flexibilidad mientras sigue imponiendo inmutabilidad después de la construcción del objeto.
Beneficios de Init sobre Private Set
Anteriormente, los desarrolladores usaban un accesor private set para limitar la modificación de la propiedad fuera de la clase.
public class Person
{
public string FirstName { get; private set; }
public string LastName { get; private set; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}Public Class Person
Private privateFirstName As String
Public Property FirstName() As String
Get
Return privateFirstName
End Get
Private Set(ByVal value As String)
privateFirstName = value
End Set
End Property
Private privateLastName As String
Public Property LastName() As String
Get
Return privateLastName
End Get
Private Set(ByVal value As String)
privateLastName = value
End Set
End Property
Public Sub New(ByVal firstName As String, ByVal lastName As String)
Me.FirstName = firstName
Me.LastName = lastName
End Sub
End ClassAunque este enfoque funciona, requiere código redundante de constructor para inicializar propiedades. Además, permite que la clase misma modifique las propiedades más tarde, lo cual no siempre es ideal para objetos inmutables. La palabra clave init elimina este problema, ya que solo permite la inicialización en el momento de la creación del objeto y bloquea cualquier modificación después.
Manejo de la inicialización con campos de sólo lectura y accesores Init
La palabra clave init puede inicializar campos o propiedades durante la creación del objeto mientras permanecen inmutables después. Mientras los campos de solo lectura proporcionan inmutabilidad, el accesor init ofrece una capacidad similar para las propiedades. He aquí cómo puedes manejar la inmutabilidad de dos maneras: usando campos de solo lectura y propiedades init.
Uso de campos de sólo lectura con un constructor
En este ejemplo, utilizamos campos de solo lectura para firstName y lastName, que se establecen durante la construcción del objeto. Estos campos solo pueden asignarse una vez en el constructor y no pueden modificarse después:
public class Person
{
private readonly string firstName;
private readonly string lastName;
public string FirstName => firstName;
public string LastName => lastName;
public Person(string firstName, string lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}Public Class Person
'INSTANT VB NOTE: The field firstName was renamed since Visual Basic does not allow fields to have the same name as other class members:
Private ReadOnly firstName_Conflict As String
'INSTANT VB NOTE: The field lastName was renamed since Visual Basic does not allow fields to have the same name as other class members:
Private ReadOnly lastName_Conflict As String
Public ReadOnly Property FirstName() As String
Get
Return firstName_Conflict
End Get
End Property
Public ReadOnly Property LastName() As String
Get
Return lastName_Conflict
End Get
End Property
Public Sub New(ByVal firstName As String, ByVal lastName As String)
Me.firstName_Conflict = firstName
Me.lastName_Conflict = lastName
End Sub
End ClassUso de accesores Init para inicialización
Alternativamente, podemos usar el accesor init para crear propiedades de solo lectura que pueden inicializarse durante la creación del objeto pero no pueden cambiarse después. Esto elimina la necesidad de campos de solo lectura y proporciona una sintaxis más moderna:
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
End ClassIntroducción a IronPDF

IronPDF es una poderosa biblioteca de generación y manipulación de PDF diseñada para desarrolladores de C#. Simplifica el trabajo con PDFs convirtiendo HTML, CSS, imágenes y otros contenidos en documentos PDF. Con características como renderizado perfecto al píxel, soporte multiplataforma e integración fácil en proyectos .NET, IronPDF es ideal para desarrolladores que necesitan crear PDFs de alta calidad rápidamente. Puedes usarlo con .NET Core, Framework y Standard, y soporta una amplia gama de plataformas, incluyendo Windows, Linux y macOS.
Caso: Uso de IronPDF con la palabra clave Init de C#
Para crear objetos inmutables en un proyecto de C# mientras se generan PDFs, puedes combinar la palabra clave init con IronPDF. La palabra clave init asegura la integridad del objeto después de ser inicializado, mientras que IronPDF procesa los datos y genera PDFs basándose en ese modelo inmutable.
Asegúrate de que IronPDF esté correctamente referenciado en tu proyecto. Puedes instalarlo a través de NuGet:
Aquí está el ejemplo de código:
using IronPdf;
public class Person
{
public int Id { get; init; }
public string FirstName { get; init; }
public string LastName { get; init; }
}
public class PDFGenerator
{
public static void CreatePersonPDF(Person person)
{
var htmlContent = $@"
<html>
<body>
<h1>Person Information</h1>
<p>ID: {person.Id}</p>
<p>First Name: {person.FirstName}</p>
<p>Last Name: {person.LastName}</p>
</body>
</html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs($"Person_{person.Id}.pdf");
}
}
class Program
{
static void Main(string[] args)
{
var person = new Person
{
Id = 1,
FirstName = "Iron",
LastName = "Dev"
};
PDFGenerator.CreatePersonPDF(person);
}
}Imports IronPdf
Public Class Person
Public Property Id() As Integer
Public Property FirstName() As String
Public Property LastName() As String
End Class
Public Class PDFGenerator
Public Shared Sub CreatePersonPDF(ByVal person As Person)
Dim htmlContent = $"
<html>
<body>
<h1>Person Information</h1>
<p>ID: {person.Id}</p>
<p>First Name: {person.FirstName}</p>
<p>Last Name: {person.LastName}</p>
</body>
</html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs($"Person_{person.Id}.pdf")
End Sub
End Class
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim person As New Person With {
.Id = 1,
.FirstName = "Iron",
.LastName = "Dev"
}
PDFGenerator.CreatePersonPDF(person)
End Sub
End ClassConclusión
En resumen, la palabra clave init de C# te permite crear objetos inmutables mientras ofrece flexibilidad durante la inicialización del objeto. Es una alternativa más limpia y segura a los accesores private set, reduciendo la necesidad de código redundante en el constructor. Combinar la palabra clave init con campos de solo lectura, estructuras y lógica de validación te ayuda a construir estructuras de datos robustas y seguras que preservan la inmutabilidad sin sacrificar la legibilidad o flexibilidad. IronPDF ofrece una prueba gratuita, y las licencias comienzan desde $999. Esto te da acceso a todas sus funciones, incluyendo edición, compresión, y aseguramiento de PDFs.

Jacob Mellor es Director de Tecnología de Iron Software y un ingeniero visionario pionero en la tecnología C# PDF. Como desarrollador original de la base de código principal de Iron Software, ha dado forma a la arquitectura de productos de la empresa desde su creación, transformándola, junto con el director ejecutivo Cameron Rimington, en una empresa de más de 50 personas que presta servicios a la NASA, Tesla y organismos gubernamentales de todo el mundo.
Artículos Relacionados


