P
prepair.app
Comenzar entrevista →
EnglishУкраїнськаРусскийDeutsch
🟣

Preguntas de entrevista .NET

Las entrevistas de .NET se mueven entre C# como lenguaje y el runtime que hay debajo — el CLR, el GC, cómo funciona realmente async/await — antes de llegar a ASP.NET Core y Entity Framework Core, donde viven la mayoría de las preguntas prácticas. Aquí están las preguntas más frecuentes, cada una con una respuesta modelo.

Junior · sin experiencia / menos de 1 añoMiddle · 2–4 años de experienciaSenior · 5+ años de experiencia

Qué preguntan

Tipos de C#, LINQ y nullable reference types
Async/await y el modelo Task
CLR, JIT y garbage collection
ASP.NET Core: middleware y dependency injection
Entity Framework Core y rendimiento de consultas
Testing con xUnit/Moq, Docker y despliegue en la nube

9 preguntas reales con respuestas

Cada pregunta viene con una respuesta modelo con la que puedes comparar la tuya.

1

¿Cuál es la diferencia entre value types y reference types en C#?

Respuesta

Un value type (struct, int, bool, enum) guarda sus datos directamente y se copia al asignarlo; un reference type (class, string, arrays) guarda un puntero a datos en el heap, y al asignarlo se copia el puntero, no el objeto. Pasar una struct a un método que la muta opera silenciosamente sobre una copia, a menos que la pases por ref. Una struct guardada en un campo de una clase vive en el heap junto con ella, no en el stack.

2

¿Qué son boxing y unboxing, y por qué importan para el rendimiento?

Respuesta

Boxing envuelve un value type en un objeto del heap para tratarlo como object — por ejemplo, pasar un int donde se espera object, o a un ArrayList no genérico. Unboxing lo convierte de vuelta y copia el valor. Cada box es una asignación en el heap y candidato al GC, así que un bucle que boxea millones de ints genera presión real de recolección que los genéricos evitan por completo.

3

¿Qué problema resuelven los nullable reference types?

Respuesta

Antes de C# 8, string name y un valor que podía ser null se veían idénticos, así que el compilador no podía avisarte de que un método que devolvía null iba a explotar tres llamadas después. Con nullable reference types activados, string significa "nunca null" y string? significa "puede ser null", y el compilador avisa cuando desreferencias un tipo ? sin comprobación. No añade aplicación en tiempo de ejecución, pero convierte la mayoría de los bugs de referencia nula en avisos de compilación en lugar de una NullReferenceException a las 2 de la madrugada.

4

¿Qué significa que la ejecución de una consulta LINQ sea diferida?

Respuesta

var query = users.Where(u => u.Active) no toca los datos — construye una tubería que se ejecuta cuando la enumeras con foreach, .ToList(), .Count(), o algo similar. Por eso la misma variable de consulta puede devolver resultados distintos si la colección subyacente cambia entre construirla y enumerarla, y por eso llamar .ToList() demasiado pronto anula el filtrado posterior, mientras que llamarlo demasiado tarde en un IQueryable significa que se vuelve a la base de datos en cada enumeración.

5

¿Qué ocurre realmente cuando haces `await` sobre un `Task`?

Respuesta

El compilador reescribe el método como una máquina de estados: el código hasta el await se ejecuta de forma síncrona, y si la tarea esperada aún no ha terminado, el método devuelve el control a quien lo llamó de inmediato, liberando el hilo. Cuando la tarea termina, la continuación se retoma — por defecto en el SynchronizationContext capturado en apps de UI, por eso ConfigureAwait(false) en código de librería evita deadlocks. async no significa "se ejecuta en otro hilo"; significa "no bloquea el hilo mientras espera".

6

¿Qué son las generaciones del GC y por qué las usa el runtime?

Respuesta

El CLR agrupa los objetos en generación 0, 1 y 2 partiendo de la observación de que la mayoría de los objetos mueren jóvenes — un DTO del ámbito de un request es basura en milisegundos, un objeto de configuración cacheado sobrevive toda la vida de la app. Las recolecciones de gen 0 son baratas y frecuentes; el que sobrevive se promueve a gen 1, luego a gen 2, y las recolecciones de gen 2 recorren todo el heap vivo y son costosas. Los objetos de 85.000 bytes o más van directo al Large Object Heap, que se recolecta junto con gen 2 y no compacta por defecto.

7

Describe el pipeline de middleware en ASP.NET Core.

Respuesta

Cada request pasa por el middleware registrado en Program.cs en el orden en que se añadió — típicamente manejo de excepciones, redirección HTTPS, enrutamiento, autenticación, autorización, y luego el endpoint. Cada middleware puede actuar antes de llamar a next(), después, o ambas cosas, y puede cortar la cadena sin llamar a next() en absoluto, que es como la autenticación rechaza un request antes de que llegue al controlador. El orden no es cosmético — poner autorización antes que el enrutamiento significa que aún no hay un endpoint emparejado contra el que comprobar políticas, y eso lanza una excepción.

8

¿Cuándo causa Entity Framework Core un problema N+1, y cómo se soluciona?

Respuesta

Cargar una lista de pedidos y luego acceder a order.Customer.Name dentro de un foreach sin carga anticipada dispara una consulta por pedido — el mismo patrón N+1 que en cualquier ORM. Include(o => o.Customer) lo soluciona con un JOIN, o AsSplitQuery() cuando un join multiplicaría filas por varias colecciones incluidas. El change tracking es un costo relacionado: EF Core guarda una instantánea de cada entidad rastreada para detectar cambios en SaveChanges(), lo cual es trabajo desperdiciado para una lista de solo lectura, así que las rutas de lectura deberían usar AsNoTracking().

9

¿Cuál es la diferencia entre los ciclos de vida de DI integrados — Transient, Scoped y Singleton?

Respuesta

Transient crea una instancia nueva cada vez que se solicita. Scoped crea una instancia por request y la reutiliza durante el resto de ese request. Singleton crea una instancia para toda la vida de la aplicación. El bug clásico es inyectar un servicio scoped — como un DbContext — en un singleton: el singleton captura la instancia scoped del primer request y la retiene para siempre, lo que o bien falla en usos posteriores o comparte estado silenciosamente entre requests sin relación.

🦎

Leer respuestas no es suficiente

En una entrevista real hablas bajo presión. Cam hace estas mismas preguntas, evalúa cada respuesta y muestra exactamente qué mejorar.

Practicar entrevista de .NET Backend Developer →
Gratis · 3 entrevistas al mes

Vale la pena leer

Todos los artículos →

Otras especializaciones

🔍Manual QA🤖QA AutomationJava Backend🐍Python Backend🐘PHP Backend🦫Go Backend🟢Node.js Backend💎Ruby on Rails🔷C++🟨JavaScript⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js🍏iOS (Swift)🟩Android (Kotlin)📱React Native Developer⚙️DevOps / SRE🗄️Data Engineer🧠AI/ML Engineer📊Data Scientist📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing🧑‍💼HR / Recruiter🤝Sales / Account Manager🎧Technical Support Engineer