GitHub Copilot ya no es una herramienta experimental. En 2025 es parte central del flujo de trabajo de millones de desarrolladores y, cuando se combina con el ecosistema .NET moderno, el salto de productividad es medible y significativo. Este artículo explora cómo aprovechar esa sinergia al máximo.

El cambio de paradigma: de copiloto a agente

La primera versión de GitHub Copilot completaba líneas de código. La versión actual va mucho más lejos: puede razonar sobre tu base de código completa, proponer refactorizaciones, generar suites de pruebas, explicar comportamientos complejos y, con el modo agente, ejecutar pasos múltiples de forma autónoma dentro de Visual Studio o VS Code.

Para los desarrolladores .NET, esto significa que tareas que antes tomaban horas, como crear un repositorio genérico con Entity Framework, escribir los controladores de una API REST o configurar middleware de autenticación, ahora se generan en minutos con el contexto correcto.

Caso 1: Generando un servicio completo desde un comentario

Una de las habilidades más útiles de Copilot en .NET es su capacidad de generar implementaciones completas a partir de un comentario bien redactado. Veamos un ejemplo con un servicio de pedidos:

// Servicio para gestión de pedidos de e-commerce.
// Debe: validar stock, calcular totales con descuentos,
// persistir con EF Core y publicar evento PedidoCreado en MassTransit.

public class PedidoService(TiendaDbContext db, IPublishEndpoint bus)
    : IPedidoService
{
    public async Task<PedidoDto> CrearPedidoAsync(
        CrearPedidoRequest request,
        CancellationToken ct = default)
    {
        var productos = await db.Productos
            .Where(p => request.Items.Select(i => i.ProductoId)
                .Contains(p.Id))
            .ToListAsync(ct);

        foreach (var item in request.Items)
        {
            var producto = productos.First(p => p.Id == item.ProductoId);
            if (producto.Stock < item.Cantidad)
                throw new StockInsuficienteException(producto.Nombre);
        }

        var pedido = new Pedido
        {
            ClienteId  = request.ClienteId,
            FechaCreacion = DateTime.UtcNow,
            Items = request.Items.Select(i => new PedidoItem
            {
                ProductoId = i.ProductoId,
                Cantidad   = i.Cantidad,
                PrecioUnitario = productos.First(p => p.Id == i.ProductoId).Precio
            }).ToList()
        };

        pedido.Total = pedido.Items.Sum(i => i.Cantidad * i.PrecioUnitario);
        db.Pedidos.Add(pedido);
        await db.SaveChangesAsync(ct);

        await bus.Publish(new PedidoCreadoEvent
        {
            PedidoId = pedido.Id,
            ClienteId = pedido.ClienteId,
            Total = pedido.Total
        }, ct);

        return pedido.ToDto();
    }
}

Tip de productividad: Cuanto más explícito sea el comentario sobre dependencias y comportamiento esperado, mejor será la sugerencia. Menciona las librerías que usas (EF Core, MassTransit, FluentValidation) para que Copilot ajuste la implementación a tu stack real.

Caso 2: Generación de pruebas unitarias con Copilot Chat

La escritura de pruebas es una de las tareas más postergadas en el desarrollo diario. Con Copilot Chat puedes generar una suite completa usando un prompt preciso:

Copilot Chat — prompt
Genera pruebas unitarias con xUnit y NSubstitute para CrearPedidoAsync.
Cubre: stock suficiente (happy path), stock insuficiente (excepción), publicación del evento en MassTransit y cancellation token respetado.

public class PedidoServiceTests
{
    private readonly TiendaDbContext _db;
    private readonly IPublishEndpoint _bus;
    private readonly PedidoService _sut;

    public PedidoServiceTests()
    {
        var options = new DbContextOptionsBuilder<TiendaDbContext>()
            .UseInMemoryDatabase(Guid.NewGuid().ToString())
            .Options;
        _db  = new TiendaDbContext(options);
        _bus = Substitute.For<IPublishEndpoint>();
        _sut = new PedidoService(_db, _bus);
    }

    [Fact]
    public async Task CrearPedido_StockSuficiente_CreaPedidoYPublicaEvento()
    {
        // Arrange
        var producto = new Producto { Id = 1, Nombre = "Laptop", Precio = 1500m, Stock = 10 };
        _db.Productos.Add(producto);
        await _db.SaveChangesAsync();

        var request = new CrearPedidoRequest
        {
            ClienteId = 42,
            Items = [new { ProductoId = 1, Cantidad = 2 }]
        };

        // Act
        var result = await _sut.CrearPedidoAsync(request);

        // Assert
        result.Total.Should().Be(3000m);
        await _bus.Received(1).Publish(
            Arg.Is<PedidoCreadoEvent>(e => e.ClienteId == 42),
            Arg.Any<CancellationToken>());
    }

    [Fact]
    public async Task CrearPedido_StockInsuficiente_LanzaExcepcion()
    {
        // Arrange
        var producto = new Producto { Id = 2, Nombre = "Monitor", Stock = 1 };
        _db.Productos.Add(producto);
        await _db.SaveChangesAsync();

        // Act & Assert
        await _sut.Invoking(s => s.CrearPedidoAsync(
            new CrearPedidoRequest
            {
                Items = [new { ProductoId = 2, Cantidad = 5 }]
            }))
        .Should().ThrowAsync<StockInsuficienteException>();
    }
}

Caso 3: Refactorización asistida por IA

Copilot no solo genera código nuevo, también entiende el código existente y propone mejoras. Un flujo muy práctico en .NET es pedirle que convierta métodos síncronos heredados a su versión asíncrona, o que aplique patrones modernos de C# 12/13:

Copilot Chat — prompt de refactorización

#selection
Refactoriza usando: primary constructors de C# 12, collection expressions, pattern matching exhaustivo y convierte los bucles foreach a LINQ donde mejore la legibilidad. Mantén el comportamiento idéntico.

// ANTES — C# 8 clásico
public class ReporteService
{
    private readonly IVentasRepository _repo;
    public ReporteService(IVentasRepository repo) => _repo = repo;

    public List<string> ObtenerResumen(List<Venta> ventas)
    {
        var resultado = new List<string>();
        foreach (var v in ventas)
            resultado.Add($"{v.Fecha:d}: Q{v.Total:N2}");
        return resultado;
    }
}

// DESPUÉS — C# 12 con Copilot
public class ReporteService(IVentasRepository repo)  // primary constructor
{
    public List<string> ObtenerResumen(List<Venta> ventas) =>
        [..ventas.Select(v => $"{v.Fecha:d}: Q{v.Total:N2}")]; // collection expr
}

Configurando Copilot para proyectos .NET empresariales

Para proyectos más grandes, Copilot puede incluir contexto adicional a través del archivo .github/copilot-instructions.md. Esto le indica al modelo las convenciones específicas de tu equipo:

markdown.github/copilot-instructions.md

# Instrucciones para GitHub Copilot — SistemaVentas GT

## Stack
- .NET 9, ASP.NET Core, Entity Framework Core 9
- MassTransit con RabbitMQ para mensajería
- xUnit + NSubstitute + FluentAssertions para pruebas
- Patrón Repository + CQRS con MediatR

## Convenciones
- Usar primary constructors en clases de servicio
- Nombres de variables y comentarios: español
- Campos privados con prefijo `_` (camelCase)
- Nunca usar `var` para tipos primitivos
- Manejo de errores con Result<T> (no excepciones en servicios)
- Logs con ILogger<T> usando mensajes estructurados en español

## Patrones preferidos
- CancellationToken siempre en métodos async
- ConfigureAwait(false) en librerías compartidas

Consejo de equipo: Versiona el archivo copilot-instructions.md en tu repositorio. Todos los miembros del equipo obtendrán sugerencias alineadas con las convenciones del proyecto sin necesidad de configuración individual.

Flujo de trabajo recomendado con Copilot en .NET

Define la interfaz primero

Escribe la interfaz IServicio con comentarios XML detallados. Copilot usará eso para generar la implementación alineada con tu contrato.

Genera la implementación con contexto

Abre el archivo de implementación y deja que Copilot sugiera. Si el resultado no es exacto, usa Ctrl+I para refinar con un prompt.

Genera las pruebas inmediatamente

Usa Copilot Chat con #file para generar la suite de pruebas antes de integrar el código. Es mucho más fácil que hacerlo después.

Revisa y valida — no delegues el criterio

Copilot genera código plausible, no necesariamente correcto. Revisa la lógica de negocio, los edge cases y la seguridad. El criterio sigue siendo tuyo.

Usa el modo agente para scaffolding

Para crear módulos completos (controller + service + repository + tests), el modo agente puede ejecutar múltiples pasos y crear todos los archivos necesarios.

Advertencia importante: No incluyas secretos, credenciales ni datos sensibles de producción en el contexto de Copilot. Aunque GitHub aplica políticas de privacidad, la higiene de seguridad debe ser parte del flujo con cualquier herramienta de IA.

Más allá del editor: Copilot en pull requests y CLI

GitHub Copilot también opera fuera del IDE. Con Copilot code review puedes obtener revisiones automáticas de tus pull requests con sugerencias concretas de mejora. Con la extensión Copilot CLI, puedes usar lenguaje natural para construir comandos de terminal complejos:

# Copilot explica qué hace un comando antes de ejecutarlo
gh copilot explain "dotnet ef migrations list --project src/Infraestructura"

# Copilot sugiere el comando correcto desde lenguaje natural
gh copilot suggest "ver los logs de los últimos 10 minutos del contenedor api-ventas"
> docker logs api-ventas --since 10m --follow

# Generar script de migración con descripción
gh copilot suggest "crear migration de EF Core llamada AgregarIndiceClienteId"
> dotnet ef migrations add AgregarIndiceClienteId --project src/Infraestructura

¿Reemplaza Copilot a los desarrolladores .NET?

No, y la evidencia lo confirma. Lo que hace es eliminar la fricción en las partes más repetitivas del trabajo: scaffolding, conversión de tipos, boilerplate de configuración, pruebas de bajo valor cognitivo. Esto libera tiempo y energía mental para lo que realmente importa: diseño de arquitectura, decisiones de negocio, rendimiento, seguridad y experiencia de usuario.

El desarrollador .NET que entiende EF Core, comprende los trade-offs entre gRPC y REST, o sabe cuándo usar un canal de Channels en lugar de una cola, sigue siendo indispensable. Copilot amplifica esas capacidades; no las sustituye.

GitHub Copilot en 2025 es la herramienta de productividad más impactante disponible para desarrolladores .NET desde la llegada de LINQ. Combinado con las convenciones modernas de C# 12, el ecosistema de .NET Aspire y una estrategia clara de prompts y configuración por equipo, puede transformar un sprint de dos semanas en uno de diez días sin sacrificar calidad. La clave está en usarlo con criterio: como un par de programación muy bien informado, no como un oráculo infalible.

Por favor síguenos y dale me gusta: