Una de las nuevas características sorprendentes de C# 12 es la compatibilidad con constructores primarios. El concepto de constructores primarios no es nuevo. Varios lenguajes de programación, incluidos Scala, Kotlin y OCaml, brindan soporte para integrar los parámetros del constructor directamente en el lugar donde declara su clase. En este artículo, analizaremos de cerca los constructores primarios y cómo podemos trabajar con ellos en C# 12. Para ejecutar los ejemplos de código proporcionados en este artículo, debe tener Visual Studio 2022 instalado en su sistema. Si aún no tiene una copia, puede descargar Visual Studio 2022 aquí. Cree un proyecto de aplicación de consola en Visual Studio En primer lugar, creemos un proyecto de aplicación de consola .NET Core en Visual Studio. Suponiendo que Visual Studio 2022 esté instalado en su sistema, siga los pasos que se describen a continuación para crear una nueva aplicación de consola .NET Core. Inicie el IDE de Visual Studio. Haga clic en «Crear nuevo proyecto». En la ventana «Crear nuevo proyecto», seleccione «Aplicación de consola (.NET Core)» de la lista de plantillas que se muestran. Haga clic en Siguiente. En la ventana «Configura tu nuevo proyecto», especifica el nombre y la ubicación del nuevo proyecto. Haga clic en Siguiente. En la ventana «Información adicional» que se muestra a continuación, elija «.NET 8.0 (soporte a largo plazo)» como la versión del marco que desea utilizar. Haga clic en Crear. Usaremos este proyecto de aplicación de consola .NET 8 para trabajar con constructores primarios en las secciones siguientes de este artículo. ¿Qué son los constructores primarios? Los constructores primarios le permiten declarar constructores en una clase o estructura con parámetros disponibles en todo el cuerpo del tipo. Usando constructores primarios, puede crear constructores para su clase o estructura sin escribir código, es decir, sin declarar explícitamente miembros de datos privados e implementar constructores para asignar los valores de los parámetros del constructor a esos miembros de datos. El siguiente fragmento de código ilustra un constructor primario declarado dentro una estructura. public readonly struct Rectángulo(doble x, doble y) { //Miembros de la estructura Rectángulo }A continuación se muestra una implementación simple de un constructor primario declarado dentro de una clase.public class Rectángulo(doble x, doble y) { //Miembros de la clase Rectángulo }Los parámetros del constructor principal tienen como alcance la clase en su conjunto. Son accesibles para todos los miembros de la instancia excepto para los constructores secundarios. En C#, el compilador infiere qué campos privados requerimos y captura los valores correspondientes. Considere el siguiente fragmento de código que implementa un constructor principal para una clase llamada Customer.public class Customer(int id, string FirstName, string LastName) { //Implemente los miembros de la clase aquí }Las propiedades pertenecientes a esta clase se inicializarán automáticamente usando los parámetros del constructor primario. Pros y contras de los constructores primarios en C# Los constructores primarios en C# ofrecen tres beneficios clave. Sintaxis simplificada: al utilizar constructores primarios, puede declarar e inicializar propiedades directamente dentro de los parámetros del constructor, lo que reduce la duplicación de código. Inicialización sencilla: puede aprovechar los constructores primarios para inicializar las propiedades de una clase con valores predeterminados o valores específicos pasados ​​como parámetros del constructor. Inmutabilidad: puede aprovechar el modificador init en las propiedades inicializadas en el constructor principal para garantizar que sean de solo lectura después de la inicialización del objeto. Los constructores primarios en C# también tienen varias desventajas. Flexibilidad reducida: los constructores primarios están diseñados para ser simples, lo que puede limitar su flexibilidad. Es posible que no sean adecuados cuando se necesita una lógica de inicialización compleja o cuando se requieren acciones adicionales, como validación, programación o registro. Código menos explícito: reducir el código repetitivo es una buena práctica, pero también puede hacer que el código sea menos explícito. Los desarrolladores sin experiencia pueden necesitar ayuda para comprender cómo se inicializan las propiedades o cómo funciona el constructor. Problemas de compatibilidad: integrar perfectamente la nueva sintaxis de los constructores primarios en una base de código existente podría ser un desafío, especialmente si la base de código es grande y compleja. Control limitado sobre los modificadores de acceso: un constructor primario ofrece menos control sobre los modificadores de acceso que un constructor tradicional. Por lo tanto, los constructores primarios pueden no ser adecuados en escenarios que requieren un control detallado sobre la accesibilidad. Curva de aprendizaje: debido a que los constructores principales son nuevos en el lenguaje de programación C#, es posible que sus desarrolladores necesiten tiempo para ponerse al día con su uso, lo que podría ralentizar el desarrollo de su proyecto. Usar constructores sobrecargados con un constructor primario en C# Puede usar constructores sobrecargados en cualquier clase que tenga un constructor primario. El siguiente fragmento de código ilustra cómo se pueden crear varios constructores en una clase que tiene un constructor principal.clase pública Usuario(int id, cadena nombre de usuario, cadena contraseña) { //Implementar los miembros de la clase aquí }// Otros miembros de la clase }Uso de constructores primarios en tipos de registros versus clases en C#Si bien tanto los registros como las clases admiten constructores primarios, existen diferencias sutiles en el comportamiento. Por ejemplo, así es como puede definir un tipo de registro que usa un constructor primario: registro público AuthorRecord(int Id, cadena nombre, cadena apellido, cadena dirección, cadena teléfono); y así es como puede definir una clase que usa un constructor primario: registro público AuthorClass (int Id, cadena nombre, cadena apellido, cadena dirección, cadena teléfono); puede crear una instancia del tipo de registro anterior como se muestra a continuación. var AuthorRecord = AuthorRecord(int Id, cadena nombre, cadena apellido, cadena dirección, cadena teléfono); Sin embargo, si intenta asignar valores a los miembros de datos del tipo de registro de la forma que se muestra a continuación, encontrará un error del compilador. AuthorRecord.Id = 1; Por el contrario, puede crear una instancia del tipo de clase anterior y asignar valores a sus miembros de datos como se muestra a continuación, sin ningún error del compilador.var AuthorClass = AuthorClass(int Id, string firstName, string lastName, string dirección, teléfono de cadena); AuthorClass.Id = 1;Utilice la inyección de dependencias en constructores primarios en C#. Puede aprovechar los constructores primarios al implementar la inyección de dependencias en su aplicación C#. Entendamos esto con un ejemplo. El siguiente código ilustra cómo podemos implementar la inyección de constructor en C#.public class AuthorService { private readonly IAuthorRepository _authorRepository; public AuthorService(IAuthorRepository autorRepositorio) { _autorRepository = autorRepositorio; } Tarea asíncrona pública> GetAll() { retorno espera _authorRepository.GetAll(); } }Finalmente, observe cómo se pueden usar los constructores primarios para hacer que su código sea más nítido y limpio, como se muestra en el siguiente fragmento de código.public class AuthorService (IAuthorRepositoryauthorRepository) { public async Task> GetAll() { retorno espera autorRepository.GetAll(); } }Aunque los constructores primarios se introdujeron inicialmente en C# 9, estaban limitados a tipos de registros únicamente. Con C# 12, puede utilizar constructores primarios en tipos de registros, clases y estructuras, lo que le ayudará a escribir código repetitivo que sea más limpio y conciso. Copyright © 2024 IDG Communications, Inc.

Source link