Introducción: La leyenda del C# «muerto»
Seguramente has escuchado que C# es un lenguaje para «corporativos», donde todo es aburrido, lento y cubierto por una capa de burocracia empresarial. Pero la verdad es que el desarrollador C# hoy en día es un soldado universal de TI. Escribe microservicios rápidos con ASP.NET Core, optimiza consultas a la base de datos mediante Entity Framework y, a veces, incluso integra aprendizaje automático con ML.NET.
En este artículo no hablaré de teorías abstractas. Recorreremos un día laboral típico de un programador C# en una empresa real: desde el café matutino hasta el push de código a producción. Verás ejemplos de código, herramientas y trucos que te ahorrarán horas de trabajo.
08:30 — Mañana: Café, correo y tablero de tareas
El día no comienza con código, sino con contexto. Lo primero que hago es abrir Slack y Jira. En un equipo típico hay un standup matutino (daily stand-up). En él respondemos tres preguntas:
- ¿Qué se hizo ayer?
- ¿Qué haré hoy?
- ¿Hay algún bloqueador?
Después del standup, una revisión rápida de los pull requests de los compañeros. La revisión de código en C# no es solo una «casilla de verificación». Aquí es importante verificar si hay fugas de memoria (especialmente con IDisposable) y si se usa correctamente async/await.
Ejemplo de la vida real: revisión de código de un método asíncrono
// Mal: llamada bloqueante dentro de un método asyncpublic async Task<User> GetUserAsync(int id){ var user = _context.Users.Find(id); // .Find — ¡síncrono! return await Task.FromResult(user); // Envoltura inútil}
// Bien: completamente asíncronopublic async Task<User> GetUserAsync(int id){ return await _context.Users.FindAsync(id); // Asincronía real}Un detalle así puede matar el rendimiento bajo carga. Por eso, el programador C# debe vigilar la asincronía en cada paso.
10:00 — Trabajo con la tarea: Escribimos un nuevo endpoint API
Hoy en el backlog hay una tarea: «Añadir filtrado de productos por precio». Esta es una historia típica para un desarrollador .NET. Trabajo en Visual Studio 2022 con ReSharper (sí, va lento, pero sin él estoy perdido).
Paso 1: Modelo y DTO
Primero definimos el modelo de datos. Supongamos que tenemos Entity Framework Core y una base de datos PostgreSQL.
public class Product{ public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Category { get; set; }}
public class ProductFilterDto{ public decimal? MinPrice { get; set; } public decimal? MaxPrice { get; set; } public string? Category { get; set; }}Paso 2: Repositorio con IQueryable
El truco principal es no traer todos los datos a la memoria, sino usar IQueryable. Esto permite formar la consulta SQL en el lado de la base de datos.
public async Task<List<Product>> GetFilteredProductsAsync(ProductFilterDto filter){ var query = _context.Products.AsQueryable();
if (filter.MinPrice.HasValue) query = query.Where(p => p.Price >= filter.MinPrice.Value);
if (filter.MaxPrice.HasValue) query = query.Where(p => p.Price <= filter.MaxPrice.Value);
if (!string.IsNullOrEmpty(filter.Category)) query = query.Where(p => p.Category == filter.Category);
return await query.ToListAsync();}Observa: no llamamos a .ToList() hasta el final. Este es un patrón básico pero críticamente importante para cualquier desarrollador C#.
Paso 3: Controlador ASP.NET Core
[ApiController][Route("api/[controller]")]public class ProductsController : ControllerBase{ private readonly IProductRepository _repo;
public ProductsController(IProductRepository repo) =&g