Preguntas de entrevista C#/.NET backend con respuestas

Milad Bonakdar
Autor
Prepárate para entrevistas backend C#/.NET con preguntas prácticas sobre ASP.NET Core, EF Core, async, DI, APIs REST, pruebas y arquitectura.
Introducción
Para una entrevista backend de C#/.NET, debes poder explicar cómo construyes APIs con ASP.NET Core, mantienes eficiente el acceso a datos con EF Core, usas código async sin bloquear hilos y estructuras servicios con inyección de dependencias. Las mejores respuestas conectan el concepto con un trade-off real de backend: rendimiento, fiabilidad, testabilidad o mantenibilidad.
Usa esta guía como una checklist práctica. Revisa las respuestas breves y practica convertir cada una en un ejemplo concreto de un proyecto, práctica, prueba técnica o bug de producción que hayas resuelto.
Fundamentos del Lenguaje C#
1. ¿Cuál es la diferencia entre struct y class en C#?
Respuesta:
- Class (Clase): Un tipo de referencia (se asigna en el heap). Cuando pasas un objeto de clase a un método, estás pasando una referencia a la ubicación de la memoria. Los cambios dentro del método afectan al objeto original. Admite la herencia.
- Struct (Estructura): Un tipo de valor (se asigna en la pila). Cuando pasas una estructura, se pasa una copia de los datos. Los cambios dentro del método no afectan a la estructura original. No admite la herencia (pero puede implementar interfaces).
- Uso: Utiliza
structpara estructuras de datos pequeñas e inmutables que representan un único valor (comoPoint,Color). Utilizaclasspara la mayoría de los demás objetos.
Rareza: Común Dificultad: Fácil
2. Explica async y await. ¿Cómo ayuda con la escalabilidad?
Respuesta:
async y await permiten que un método se pause mientras una operación de E/S está en curso y continúe cuando el Task termina.
- Mecanismo:
awaitno crea un hilo nuevo. En llamadas a base de datos, archivos o red, libera el hilo de la solicitud. - Escalabilidad: Mejora el throughput de endpoints ASP.NET Core ligados a E/S, pero no hace más rápido el trabajo intensivo de CPU.
- Consejo de entrevista: Menciona
CancellationTokeny métodos EF Core comoToListAsyncoSaveChangesAsynccuando hables de E/S de base de datos.
Rareza: Muy Común Dificultad: Media
3. ¿Qué es la Inyección de Dependencias (DI) y cómo se implementa en .NET?
Respuesta: La Inyección de Dependencias es un patrón de diseño donde las dependencias de una clase se proporcionan desde el exterior en lugar de crearse internamente.
- En .NET: ASP.NET Core tiene un contenedor DI integrado. Registras los servicios en
Program.cs(oStartup.csen versiones anteriores) y los inyectas a través de la inyección de constructor. - Ciclos de vida:
- Transient (Transitorio): Se crean cada vez que se solicitan.
- Scoped (Ámbito): Se crean una vez por solicitud del cliente (solicitud HTTP).
- Singleton: Se crean la primera vez que se solicitan y se comparten por todas las solicitudes posteriores.
Rareza: Muy Común Dificultad: Media
4. ¿Cuál es la diferencia entre IEnumerable<T> e IQueryable<T>?
Respuesta:
IEnumerable<T>: Ejecuta la consulta en memoria. Si se utiliza con una base de datos (EF Core), obtiene todos los datos del servidor a la memoria del cliente y luego los filtra. Bueno para LINQ to Objects.IQueryable<T>: Ejecuta la consulta de forma remota (por ejemplo, en el servidor SQL). Construye un árbol de expresión que se traduce en una consulta SQL. El filtrado se realiza en el lado de la base de datos, lo que es mucho más eficiente para grandes conjuntos de datos.
Rareza: Común Dificultad: Media
5. ¿Qué son los Métodos de Extensión?
Respuesta: Los métodos de extensión te permiten "agregar" métodos a los tipos existentes sin crear un nuevo tipo derivado, recompilar o modificar el tipo original de otra manera.
- Sintaxis: Se definen como métodos estáticos en una clase estática. El primer parámetro especifica en qué tipo opera el método, precedido por la palabra clave
this. - Ejemplo: Agregar un método
WordCount()a la clasestring.
Rareza: Común Dificultad: Fácil
ASP.NET Core y Arquitectura
6. ¿Qué es Middleware en ASP.NET Core?
Respuesta: Los middleware son componentes de software que se ensamblan en una canalización de aplicaciones para manejar solicitudes y respuestas.
- Canalización (Pipeline): Cada componente elige si pasar la solicitud al siguiente componente en la canalización y puede realizar el trabajo antes y después de que se invoque el siguiente componente.
- Ejemplos: Autenticación, Autorización, Registro, Manejo de Excepciones, Servicio de archivos estáticos.
- El Orden Importa: El orden en que se agrega el middleware en
Program.csdefine el orden de ejecución.
Rareza: Muy Común Dificultad: Media
7. Explica la diferencia entre .NET Core y .NET Framework.
Respuesta:
- .NET Framework: La implementación original, solo para Windows. Madura, pero ligada a Windows.
- .NET Core / .NET moderno: La línea sucesora multiplataforma y open source. Desde .NET 5 normalmente se llama simplemente
.NET; las versiones actuales incluyen .NET 10 como LTS con soporte de C# 14. - Diferencias clave: .NET moderno suele ser la opción por defecto para APIs backend nuevas porque soporta contenedores Linux, versiones en paralelo, funciones actuales de ASP.NET Core y mejoras activas del runtime.
Rareza: Común Dificultad: Fácil
8. ¿Qué es Kestrel?
Respuesta: Kestrel es un servidor web multiplataforma, de código abierto y basado en eventos que se incluye por defecto en las plantillas de ASP.NET Core.
- Rol: Escucha las solicitudes HTTP y las pasa a la aplicación.
- Uso: Puede ejecutarse de forma independiente (servidor perimetral) o detrás de un proxy inverso como IIS, Nginx o Apache. Se recomienda utilizar un proxy inverso para la producción para manejar la seguridad, el balanceo de carga y la terminación SSL.
Rareza: Media Dificultad: Media
9. ¿Cómo manejas el Manejo Global de Excepciones en ASP.NET Core?
Respuesta: En lugar de bloques try-catch en cada controlador, debes utilizar middleware para el manejo global de excepciones.
UseExceptionHandler: Middleware incorporado que captura excepciones, las registra y vuelve a ejecutar la solicitud en una canalización alternativa (generalmente apuntando a una página de error o respuesta de API).- Middleware Personalizado: Puedes escribir middleware personalizado para capturar excepciones y devolver una respuesta de error JSON estandarizada (por ejemplo,
ProblemDetails).
Rareza: Común Dificultad: Media
Base de Datos y Entity Framework
10. ¿Qué es Entity Framework Core (EF Core)? ¿Code-First vs. Database-First?
Respuesta: EF Core es un Mapeador Objeto-Relacional (ORM) para .NET. Permite a los desarrolladores trabajar con una base de datos utilizando objetos .NET.
- Code-First: Defines tus clases de dominio (entidades) primero, y EF Core crea/actualiza el esquema de la base de datos basándose en ellas utilizando Migraciones. Preferido para nuevos proyectos.
- Database-First: Tienes una base de datos existente, y EF Core genera las clases .NET (scaffolding) basándose en el esquema.
Rareza: Común Dificultad: Fácil
11. ¿Qué es el problema N+1 en EF Core y cómo lo solucionas?
Respuesta: El problema N+1 aparece cuando consultas una lista de entidades y luego, dentro de un bucle, cargas una relación para cada elemento, creando muchas consultas adicionales.
- Solución: Carga datos relacionados de forma intencional con
Include, includes filtrados, proyecciones o carga explícita. Evita lazy loading en rutas críticas. - Ejemplo:
await context.Orders.Include(o => o.Customer).ToListAsync(); - Trade-off: Si incluyes varias colecciones, considera split queries o proyecciones para evitar cartesian explosion y columnas innecesarias.
Rareza: Muy Común Dificultad: Media
12. Explica el Patrón de Repositorio. ¿Por qué usarlo con EF Core?
Respuesta: El Patrón de Repositorio media entre las capas de dominio y de mapeo de datos utilizando una interfaz similar a una colección para acceder a los objetos de dominio.
- Pros: Desacopla la aplicación de la tecnología específica de acceso a datos (EF Core), facilita las pruebas unitarias (se puede simular el repositorio) y centraliza la lógica de acceso a datos.
- Contras/Debate: El
DbContextde EF Core ya es una implementación del patrón Repositorio/Unidad de Trabajo. Agregar otra capa a veces puede ser redundante ("abstracción sobre abstracción").
Rareza: Común Dificultad: Difícil
APIs REST y Servicios Web
13. ¿Cuáles son los Verbos HTTP y su uso típico?
Respuesta:
- GET: Recuperar un recurso. Seguro e Idempotente.
- POST: Crear un nuevo recurso. No Idempotente.
- PUT: Actualizar/Reemplazar un recurso existente. Idempotente.
- PATCH: Actualizar parcialmente un recurso. No necesariamente Idempotente (pero generalmente lo es).
- DELETE: Eliminar un recurso. Idempotente.
Rareza: Común Dificultad: Fácil
14. ¿Cuál es la diferencia entre 401 No Autorizado y 403 Prohibido?
Respuesta:
- 401 No Autorizado: El usuario no está autenticado. El cliente debe iniciar sesión e intentarlo de nuevo. "No sé quién eres".
- 403 Prohibido: El usuario está autenticado pero no tiene permiso para acceder al recurso. "Sé quién eres, pero no puedes hacer esto".
Rareza: Común Dificultad: Fácil
Pruebas y Mejores Prácticas
15. ¿Cuál es la diferencia entre Pruebas Unitarias y Pruebas de Integración?
Respuesta:
- Pruebas Unitarias: Prueban una pequeña unidad de código (generalmente un método) de forma aislada. Las dependencias se simulan (utilizando herramientas como Moq). Rápidas y fiables.
- Pruebas de Integración: Prueban cómo diferentes partes de la aplicación funcionan juntas (por ejemplo, endpoint de API + Base de datos). Más lentas pero verifican el comportamiento real del sistema.
Rareza: Común Dificultad: Fácil
16. ¿Cómo simulas las dependencias en las Pruebas Unitarias?
Respuesta: Los frameworks de simulación como Moq o NSubstitute se utilizan para crear implementaciones falsas de interfaces.
- Propósito: Aislar la clase bajo prueba. Por ejemplo, si se está probando un
UserService, simulas elIUserRepositorypara no golpear la base de datos real. - Ejemplo (Moq):
Rareza: Común Dificultad: Media
17. ¿Qué son los principios SOLID? Da un ejemplo de uno.
Respuesta: SOLID es un acrónimo de 5 principios de diseño para hacer que el software sea más comprensible, flexible y mantenible.
- Single Responsibility Principle (Principio de Responsabilidad Única) (SRP)
- Open/Closed Principle (Principio de Abierto/Cerrado) (OCP)
- Liskov Substitution Principle (Principio de Sustitución de Liskov) (LSP)
- Interface Segregation Principle (Principio de Segregación de la Interfaz) (ISP)
- Dependency Inversion Principle (Principio de Inversión de Dependencia) (DIP)
- Ejemplo (DIP): Los módulos de alto nivel no deben depender de los módulos de bajo nivel. Ambos deben depender de abstracciones. Esta es la base de la Inyección de Dependencias.
Rareza: Común Dificultad: Difícil
18. ¿Qué es Boxing y Unboxing? ¿Por qué evitarlo?
Respuesta:
- Boxing (Encasillamiento): Convertir un tipo de valor (como
int) a un tipo de referencia (object). Asigna memoria en el heap. - Unboxing (Desencasillamiento): Convertir el tipo de referencia de nuevo al tipo de valor.
- Rendimiento: Ambas son operaciones costosas (asignación de memoria, verificación de tipo). Los genéricos (
List<T>) ayudan a evitar el boxing/unboxing en comparación con las colecciones más antiguas (ArrayList).
Rareza: Común Dificultad: Media
19. ¿Qué es la declaración using en C#?
Respuesta:
La declaración using proporciona una sintaxis conveniente que asegura el uso correcto de los objetos IDisposable.
- Mecanismo: Llama automáticamente al método
Dispose()en el objeto cuando se sale del bloque (incluso si ocurre una excepción). - Sintaxis Moderna:
using var file = File.OpenRead("path");(no se necesitan llaves, se elimina al final del ámbito).
Rareza: Común Dificultad: Fácil
20. Explica el concepto de Middleware en el contexto del patrón "Cadena de Responsabilidad".
Respuesta: El Middleware de ASP.NET Core es una implementación clásica del patrón Cadena de Responsabilidad.
- Patrón: Una solicitud se pasa a lo largo de una cadena de manejadores. Cada manejador decide si procesar la solicitud o pasarla al siguiente manejador en la cadena.
- Aplicación: En .NET, el
RequestDelegaterepresenta el siguiente manejador. Los componentes de middleware se encadenan para formar la canalización de solicitudes.
Rareza: Poco Común Dificultad: Difícil


