Saltar al pie de página
.NET AYUDA

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 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.
$vbLabelText   $csharpLabel

Palabra Clave Init de C# (Cómo Funciona para Desarrolladores): Figura 1 - IDE mostrando un error debido a que las propiedades están marcadas como solo init

En este ejemplo, FirstName y LastName están marcadas como propiedades solo de init. 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 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"
}
$vbLabelText   $csharpLabel

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 error
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 error
Public 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 error
$vbLabelText   $csharpLabel

Esto crea un objeto simple e inmutable del tipo Point. Observa que los valores de X y Y se establecen en la inicialización y no pueden modificarse más adelante.

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 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 Class
$vbLabelText   $csharpLabel

Puedes 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
{
    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 Class
$vbLabelText   $csharpLabel

Aunque 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, usamos 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
{
    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 Class
$vbLabelText   $csharpLabel

Uso 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 string FirstName { get; init; }
    public string LastName { get; init; }
}
Public Class Person
	Public Property FirstName() As String
	Public Property LastName() As String
End Class
$vbLabelText   $csharpLabel

Introducción a IronPDF

Palabra Clave Init de C# (Cómo Funciona para Desarrolladores): Figura 2 - IronPDF: La Biblioteca de PDF para C#

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 C# Init

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:

Install-Package IronPdf

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);
    }
}
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 Class
$vbLabelText   $csharpLabel

Conclusión

Palabra Clave Init de C# (Cómo Funciona para Desarrolladores): Figura 3 - Página de Licencias de IronPDF

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 $799. Esto te da acceso a todas sus funciones, incluyendo edición, compresión, y aseguramiento de PDFs.

Preguntas Frecuentes

¿Cómo puedo convertir HTML a PDF en C#?

Puedes usar el método RenderHtmlAsPdf de IronPDF para convertir cadenas de HTML en PDFs. También puedes convertir archivos HTML a PDFs usando RenderHtmlFileAsPdf.

¿Cuál es el propósito de la palabra clave init en C#?

La palabra clave init permite definir propiedades que solo pueden establecerse durante la inicialización del objeto, asegurando la inmutabilidad posteriormente. Esta característica es particularmente útil para crear objetos que no deben cambiar una vez creados.

¿Cómo mejora la palabra clave init la inmutabilidad del objeto en C#?

La palabra clave init permite que las propiedades se establezcan solo durante la fase de inicialización del objeto, evitando cualquier cambio posterior. Esto garantiza que los objetos permanezcan inmutables una vez creados.

¿Pueden usarse las propiedades init con bibliotecas para generar PDF?

Sí, las propiedades init se pueden usar con bibliotecas como IronPDF para generar PDFs a partir de objetos inmutables, asegurando que los datos utilizados para el PDF permanezcan consistentes a lo largo del proceso.

¿Cuáles son las ventajas de usar la palabra clave init sobre los setters tradicionales?

Usar la palabra clave init sobre los setters tradicionales promueve la inmutabilidad, reduce la necesidad de un código de constructor extenso y asegura que las propiedades del objeto no puedan modificarse después de la inicialización.

¿Cómo puedo integrar la generación de PDF con propiedades inmutables en C#?

Puede crear objetos inmutables utilizando propiedades init y pasar estos objetos a IronPDF, que puede utilizar los datos para generar documentos PDF consistentes y confiables.

¿Qué papel juega la palabra clave init en la creación de aplicaciones modernas de C#?

La palabra clave init juega un papel crucial en la creación de aplicaciones modernas de C# al permitir a los desarrolladores definir objetos inmutables con una sintaxis concisa, mejorando la seguridad del código y reduciendo errores.

¿Cómo puedo instalar una biblioteca para la generación de PDF en un proyecto de C#?

Puede instalar una biblioteca como IronPDF en su proyecto de C# usando el Administrador de Paquetes NuGet con el comando: Install-Package IronPdf.

¿Por qué es importante la inmutabilidad en el desarrollo de aplicaciones?

La inmutabilidad es importante porque asegura la integridad y consistencia de los datos en toda su aplicación, facilitando el mantenimiento y reduciendo la probabilidad de errores.

¿Qué ejemplos prácticos ilustran el uso de la palabra clave init?

Un ejemplo práctico es usar la palabra clave init para definir una clase con propiedades que solo pueden establecerse durante la inicialización, asegurando que el objeto creado permanezca sin cambios. Esto es particularmente útil en escenarios donde la consistencia de los datos es crítica.

Jacob Mellor, Director de Tecnología @ Team Iron
Director de Tecnología

Jacob Mellor es Director de Tecnología en Iron Software y un ingeniero visionario que lidera la tecnología PDF en C#. Como el desarrollador original detrás de la base de código central de Iron Software, ha moldeado la arquitectura de productos de la compañía desde ...

Leer más