Saltar al contenido
Tips de Sintaxis | Buenas prácticas | Auto-Doc AI

C# 12 Moderno: Refactorización con Primary Constructors y XML Docs

Aprende a refactorizar constructores legados en C# 12 usando Primary Constructors y comentarios XML estandarizados con .NET Analyzers.

2026-11-14 · Tips de Sintaxis | Buenas prácticas | Auto-Doc AI · CSHARP

Simplificación de Inyección de Dependencias con Constructores Primarios en C# 12

El desarrollo en C# ha evolucionado significativamente con la llegada de .NET 8 y C# 12. Históricamente, la inyección de dependencias requería declarar campos privados de solo lectura (private readonly), definir un constructor explícito y asignar manualmente cada parámetro recibido a dichos campos. Este enfoque generaba un volumen considerable de código repetitivo ("boilerplate") que dificultaba la lectura y el mantenimiento de las clases del dominio y de servicios.

Con la introducción de los Primary Constructors en C# 12, podemos definir parámetros directamente en la declaración de la clase, reduciendo sustancialmente el número de líneas sin perder el control ni la claridad estructural.

Código Legado: El Enfoque Tradicional (Antes)

En versiones anteriores a C# 12, una clase de servicio típica con múltiples dependencias se estructuraba del siguiente modo:

namespace JWDocs.Services;

/// <summary>
/// Servicio para procesar pagos y emitir recibos de clientes.
/// </summary>
public class PaymentProcessor
{
    private readonly IPaymentGateway _gateway;
    private readonly ILogger _logger;

    /// <summary>
    /// Inicializa una nueva instancia de <see cref="PaymentProcessor"/>.
    /// </summary>
    /// <param name="gateway">El proveedor de pagos principal.</param>
    /// <param name="logger">El servicio de registro de eventos auditables.</param>
    public PaymentProcessor(IPaymentGateway gateway, ILogger logger)
    {
        _gateway = gateway ?? throw new ArgumentNullException(nameof(gateway));
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
    }

    public async Task ProcessAsync(decimal amount)
    {
        _logger.LogInfo("Iniciando pago...");
        await _gateway.ChargeAsync(amount);
    }
}

Refactorización Moderna con C# 12 (Después)

Al aplicar constructores primarios y la sintaxis XML adaptada de C# 12, la clase se simplifica drásticamente conservando toda su semántica y seguridad de tipos:

namespace JWDocs.Services;

/// <summary>
/// Servicio para procesar pagos y emitir recibos de clientes.
/// </summary>
/// <param name="gateway">El proveedor de pagos principal.</param>
/// <param name="logger">El servicio de registro de eventos auditables.</param>
public class PaymentProcessor(IPaymentGateway gateway, ILogger logger)
{
    public async Task ProcessAsync(decimal amount)
    {
        ArgumentNullException.ThrowIfNull(gateway);
        ArgumentNullException.ThrowIfNull(logger);

        logger.LogInfo("Iniciando pago...");
        await gateway.ChargeAsync(amount);
    }
}

Integración con .NET Analyzers y EditorConfig

Para mantener la consistencia en proyectos de gran escala, es recomendable configurar las reglas de análisis estático en tu archivo .editorconfig. De este modo, el compilador y el IDE sugerirán automáticamente la refactorización hacia constructores primarios:

[*.cs]
dotnet_style_prefer_primary_constructors = true:suggestion

Documentación Automática con Auto-Doc AI

Cuando se utilizan constructores primarios, la ubicación de la documentación XML cambia ligeramente: las etiquetas <param> se colocan directamente en el bloque XML de la clase en lugar del constructor explícito. Nuestra herramienta Code Formatter & Auto-Doc AI detecta estos parámetros del constructor primario y genera automáticamente los comentarios XML normalizados, garantizando el cumplimiento de las reglas SA1600 de StyleCop y los estándares de Microsoft sin intervención manual.

Conclusión y Buenas Prácticas

La adopción de Primary Constructors en C# 12 no solo reduce drásticamente el código repetitivo, sino que mejora la legibilidad general del sistema. Al combinar esta técnica con reglas en EditorConfig y la automatización de Auto-Doc AI, tu equipo mantendrá una base de código limpia, moderna y perfectamente documentada.

Probar fragmento en el formateador

Ver guía de solución de errores: Cómo solucionar CS1026: ) expected en C# 12

Tips relacionados