🎯 Banco de Preguntas — Junior
Preguntas reales de entrevistas para posiciones Junior Full Stack .NET + React.
Intenta responder cada pregunta en voz alta antes de ver la respuesta. En la entrevista real, pensar en voz alta muestra tu proceso de razonamiento.
C# — Tipos y Memoria
❓ ¿Dónde se almacena un value type (por ejemplo, un int) declarado como variable local en C#?
A En el heap, igual que los objetos de claseB En el stack; si está dentro de un objeto, en el heap junto a ese objetoC En el registro del procesador únicamenteD Depende del compilador y de la versión de .NET
❓ ¿Qué ocurre exactamente durante una operación de boxing en C#?
A El value type se copia dentro de un envoltorio object en el heap y la variable apunta a esa copiaB El value type se convierte en un string para poder ser tratado como objectC Se crea un puntero al value type en el stack, sin mover la memoriaD El compilador reemplaza el value type por su clase equivalente (int → Int32) en tiempo de compilación
❓ El Garbage Collector de .NET trabaja con generaciones. ¿Qué significa que un objeto esté en Gen 2?
A Que fue creado hace exactamente 2 segundosB Que es un objeto de larga vida que sobrevivió recolecciones anteriores; se recolecta con poca frecuenciaC Que tiene exactamente 2 referencias activas en el heapD Que ocupa más de 2 KB de memoria
❓ Tienes un loop que concatena 10 000 strings. ¿Qué problema tiene usar el operador `+` y cuál es la solución?
A No hay ningún problema, el compilador optimiza la concatenación automáticamente en todos los casosB Cada `+` crea un nuevo string en el heap porque string es inmutable; la solución es usar StringBuilderC El operador `+` para strings está deprecado; debes usar String.Concat() siempreD El problema es solo de legibilidad; en performance son equivalentes
❓ ¿Para qué sirve el tipo `int?` en C# y cómo se diferencia de `int`?
A Es un alias de `uint` (entero sin signo)B Es un int que puede almacenar el valor null además de cualquier entero; es equivalente a Nullable<int>C Es un int que se inicializa automáticamente a 0 si no se asignaD Es un entero de mayor precisión (64 bits en lugar de 32)
C# — Programación Orientada a Objetos
❓ ¿Cuál de los siguientes NO es uno de los 4 pilares de la Programación Orientada a Objetos?
A EncapsulamientoB HerenciaC ConcurrenciaD Polimorfismo
❓ ¿Cuándo deberías elegir una `abstract class` en lugar de una `interface`?
A Cuando quieres que una clase implemente múltiples contratos distintos al mismo tiempoB Cuando las clases derivadas comparten implementación base y estado común, y tienen relación 'es un tipo de'C Siempre que necesites definir métodos sin implementaciónD Cuando necesitas que el contrato sea implementado por clases sin relación entre sí
❓ ¿Qué diferencia hay entre `override` y `new` al redefinir un método en una subclase en C#?
A Son equivalentes: ambos reemplazan el método de la clase baseB `override` aplica polimorfismo real (se llama según el tipo en runtime); `new` oculta el método base (shadowing, se llama según el tipo en compilación)C `new` es la forma moderna de `override` introducida en C# 6D `override` solo funciona con métodos estáticos; `new` con métodos de instancia
❓ ¿Cuál es el modificador de acceso que permite acceso desde la misma clase, clases derivadas, pero NO desde ensamblados externos?
A `public`B `private`C `protected`D `internal`
C# — LINQ y Colecciones
❓ ¿Cuál es la diferencia principal entre `IEnumerable<T>`, `ICollection<T>` e `IList<T>`?
A Son sinónimos intercambiables; el compilador elige cuál usar según el contextoB `IEnumerable<T>` solo permite iterar; `ICollection<T>` añade Count y modificación; `IList<T>` añade acceso por índiceC `IList<T>` es siempre más rápido que `IEnumerable<T>` para cualquier operaciónD `IEnumerable<T>` solo funciona con arrays y no con listas genéricas
❓ ¿Cuál es la diferencia entre `FirstOrDefault()` y `SingleOrDefault()` en LINQ?
A Son idénticos; solo difieren en el nombre por razones históricasB `FirstOrDefault()` devuelve el primero sin importar cuántos haya; `SingleOrDefault()` lanza excepción si hay más de unoC `SingleOrDefault()` es más rápido porque termina antes al encontrar el primer elementoD `FirstOrDefault()` lanza excepción si no hay elementos; `SingleOrDefault()` devuelve null
❓ ¿Qué es la evaluación diferida (deferred execution) en LINQ?
A Que LINQ carga todos los datos en memoria al declarar la query para evitar múltiples accesos a la base de datosB Que la query LINQ no se ejecuta cuando se define, sino cuando se itera o se materializa con ToList()/ToArray()C Que LINQ ejecuta las operaciones en un hilo de fondo para no bloquear el hilo principalD Que LINQ pospone la compilación de la expresión lambda hasta la primera llamada
❓ ¿Cuándo preferirías un `Dictionary<TKey, TValue>` sobre una `List<T>`?
A Cuando necesitas mantener los elementos ordenados por su valorB Cuando necesitas búsquedas frecuentes por clave con complejidad O(1) en lugar de O(n)C Cuando tienes pocos elementos (menos de 10) ya que el Dictionary ocupa menos memoriaD Cuando necesitas iterar en orden de inserción
C# — Async/Await
❓ ¿Qué hace realmente `await` cuando se encuentra una operación asíncrona de I/O (como una consulta a la base de datos)?
A Crea un nuevo hilo en el ThreadPool y bloquea el hilo actual hasta que ese hilo termineB Libera el hilo actual para que pueda atender otras tareas; cuando la operación termine, reanuda la ejecuciónC Convierte la operación asíncrona en síncrona para garantizar el orden de ejecuciónD Pausa toda la aplicación hasta que la operación de I/O se complete
❓ ¿Por qué se recomienda retornar `Task` en lugar de `void` en métodos async?
A Porque `async void` no compila en versiones modernas de C#B Porque `async void` no permite al llamador observar la tarea: las excepciones se pierden y no se puede hacer await de ellaC Porque `Task` ocupa menos memoria que `void` en métodos asíncronosD No hay diferencia real; es solo una convención de estilo
❓ ¿Qué problema concreto indica el warning CS4014 en C#?
A Que el método async retorna void en lugar de TaskB Que estás llamando a un método async sin usar await, por lo que la Task no es observada y las excepciones se pierdenC Que el método async no tiene ningún await en su cuerpoD Que dos métodos async se llaman en paralelo sin sincronización
❓ ¿Para qué sirve `ConfigureAwait(false)` y en qué tipo de proyectos es importante usarlo?
A Hace que el método async se ejecute más rápido al desactivar la compresión del contextoB Evita que el código continúe en el SynchronizationContext original tras el await, evitando deadlocks en apps de escritorio/ASP.NET clásico y mejorando performance en libreríasC Permite que el método async se cancele automáticamente si el usuario navega a otra páginaD Es necesario en todos los proyectos modernos; sin él, async/await no funciona correctamente
SQL Básico
❓ Tienes tablas `Pedidos` y `Clientes`. Quieres obtener todos los pedidos aunque el cliente haya sido eliminado. ¿Qué JOIN usarías?
A INNER JOIN Clientes ON Pedidos.ClienteId = Clientes.IdB LEFT JOIN Clientes ON Pedidos.ClienteId = Clientes.IdC RIGHT JOIN Clientes ON Pedidos.ClienteId = Clientes.IdD CROSS JOIN Clientes
❓ ¿Cuál es la diferencia entre `WHERE` y `HAVING` en SQL?
A Son equivalentes; `HAVING` es simplemente la sintaxis moderna de `WHERE`B `WHERE` filtra filas individuales antes del GROUP BY; `HAVING` filtra grupos después del GROUP BYC `WHERE` solo funciona con columnas numéricas; `HAVING` funciona con cualquier tipoD `HAVING` es más rápido porque aplica el filtro después de construir los índices
❓ ¿Cuál es el propósito principal de un índice en una base de datos relacional?
A Garantizar la unicidad de los valores en una columnaB Acelerar las búsquedas y filtros evitando recorrer toda la tablaC Comprimir los datos de la tabla para ahorrar espacio en discoD Asegurar la integridad referencial entre tablas
❓ ¿Qué significa el acrónimo ACID en bases de datos relacionales?
A Authentication, Concurrency, Integrity, DurabilityB Atomicity, Consistency, Isolation, DurabilityC Availability, Consistency, Isolation, DistributionD Atomicity, Caching, Indexing, Durability
React — Fundamentos
❓ ¿Cuándo re-renderiza un componente que usa `useState`?
A En cada tick del event loop del navegador, independientemente de si el estado cambióB Solo cuando se llama a la función setter con un valor diferente al actual (React hace comparación por referencia)C Solo cuando el padre se re-renderiza, no cuando cambia el estado propioD Siempre que el usuario mueve el mouse sobre el componente
❓ ¿Qué problema causa tener un array de dependencias vacío `[]` en un `useEffect` que usa una variable del componente?
A El efecto se ejecuta en cada render, causando un bucle infinitoB El efecto captura los valores iniciales de las variables y no se actualiza cuando cambian (stale closure)C El efecto nunca se ejecuta porque React ignora los efectos con dependencias vacíasD No hay ningún problema; `[]` es el valor recomendado para todos los useEffect
❓ ¿Por qué es un problema usar el índice del array como `key` en una lista que puede cambiar de orden o tener elementos eliminados?
A React no permite el índice como key; dará un error de compilaciónB Si el orden cambia, la key de cada elemento cambia, confundiendo a React sobre qué elemento es cuál y causando bugs de estadoC El rendimiento es idéntico, es solo una recomendación de estiloD Solo es problema en listas de más de 100 elementos
❓ ¿Para qué sirve el Virtual DOM en React?
A Es una base de datos en memoria donde React guarda el estado de todos los componentesB Es una representación ligera del DOM real en JavaScript; React lo usa para calcular el mínimo conjunto de cambios necesarios antes de actualizar el DOM realC Es un mecanismo de seguridad que evita inyecciones XSS en el DOMD Es el nombre del motor de renderizado 3D que usa React Native
❓ ¿Qué ocurre cuando llamas a `setEstado` con el mismo valor que tiene actualmente el estado?
A React siempre re-renderiza el componente, independientemente del valorB React hace una comparación superficial; si el valor es el mismo (Object.is), omite el re-renderC React lanza un error porque no se puede establecer el mismo valor dos veces seguidasD El componente se re-renderiza pero sus hijos no
JavaScript / TypeScript
❓ ¿Cuál es la diferencia principal entre `var`, `let` y `const` en JavaScript?
A Solo difieren en que `const` no puede cambiar su valor; `var` y `let` son idénticosB `var` tiene scope de función y hoisting sin inicializar; `let` y `const` tienen scope de bloque y no se pueden usar antes de declararse (TDZ)C `let` y `const` solo están disponibles en módulos ES6; en scripts normales solo existe `var`D `const` evita cualquier modificación del valor, incluyendo las propiedades de objetos
❓ ¿Qué imprimirá este código? `console.log(0 == '0')` y `console.log(0 === '0')`
A false y falseB true y trueC true y falseD false y true
❓ ¿Qué es un closure en JavaScript y por qué es útil?
A Es una función que no puede acceder a variables externas; sirve para encapsular completamente su lógicaB Es una función que recuerda y accede a las variables del scope donde fue creada, incluso después de que ese scope haya terminadoC Es el mecanismo que cierra o limpia recursos (como un finally en Java) al terminar una funciónD Es una función flecha (arrow function) que no tiene su propio `this`
❓ ¿En qué orden se ejecutan las siguientes líneas y por qué?
A 1, 2, 3, 4 — en orden de aparición, JavaScript es síncronoB 1, 4, 3, 2 — los síncronos primero, luego microtasks (Promise), luego macrotasks (setTimeout)C 1, 4, 2, 3 — setTimeout siempre se ejecuta antes que las PromisesD El orden no es determinístico; depende del motor de JavaScript
❓ ¿Cuál es la diferencia entre `null` y `undefined` en JavaScript?
A Son exactamente lo mismo; solo difieren en nombre por razones históricasB `undefined` es la ausencia no intencional de valor (variable no inicializada); `null` es la ausencia intencional asignada por el programadorC `null` es para variables numéricas sin valor; `undefined` es para variables de texto sin valorD `typeof null` retorna 'null' y `typeof undefined` retorna 'undefined'
❓ En TypeScript, ¿cuándo preferirías `type` sobre `interface` para definir la forma de un objeto?
A Siempre que el objeto tenga más de 5 propiedadesB Cuando necesitas tipos unión, intersección, tipos mapeados o cuando la entidad no es un objeto (alias de primitivos, tuplas)C `type` y `interface` son completamente equivalentes; la elección es puramente personalD `interface` solo funciona en archivos .tsx; `type` funciona en cualquier archivo TypeScript
Algoritmos y Estructuras de Datos
❓ ¿Cuál es la complejidad de buscar un elemento en un array sin ordenar comparado con buscarlo en un Dictionary<K,V> en C#?
A Array: O(1) — Dictionary: O(n)B Array: O(n) — Dictionary: O(1) en promedioC Ambos son O(n) porque recorren todos los elementosD Array: O(log n) — Dictionary: O(1)
❓ ¿Cuál es la complejidad Big O de dos loops anidados que iteran N elementos cada uno?
A O(N) porque los loops comparten el mismo conjunto de elementosB O(2N) porque son dos loops que hacen N iteraciones cada unoC O(N²) porque por cada elemento externo se recorren N elementos internosD O(log N) si los elementos están ordenados
❓ Tienes que implementar un historial de navegación (ir atrás y adelante) y también una cola de impresión (primer documento enviado = primero en imprimirse). ¿Qué estructura usarías para cada caso?
A Historial: Queue<T> — Cola de impresión: Stack<T>B Historial: Stack<T> — Cola de impresión: Stack<T>C Historial: Stack<T> — Cola de impresión: Queue<T>D Ambos casos se resuelven igual con List<T>
❓ ¿Cuándo es aplicable la búsqueda binaria y cuál es su complejidad?
A Aplicable a cualquier colección; complejidad O(1)B Aplicable solo a árboles binarios; complejidad O(n)C Aplicable a arrays o listas ordenadas; complejidad O(log N)D Aplicable a diccionarios; complejidad O(N²)
Testing
❓ ¿Cuál es la diferencia principal entre un unit test, un integration test y un end-to-end (e2e) test?
A Son nombres distintos para el mismo tipo de prueba; la diferencia es solo de convención de equipoB Unit: prueba una unidad aislada con dependencias simuladas. Integration: prueba la colaboración entre componentes reales. E2E: prueba el flujo completo desde la interfaz hasta la base de datosC Unit tests solo se usan en backend; e2e tests solo se usan en frontendD Integration tests son más rápidos que unit tests porque prueban menos código
❓ En el patrón Arrange-Act-Assert (AAA), ¿qué debe contener cada sección?
A Arrange: ejecuta el código bajo prueba. Act: configura mocks. Assert: limpia el estadoB Arrange: prepara el estado y dependencias. Act: ejecuta la acción bajo prueba. Assert: verifica el resultado esperadoC Arrange y Act son opcionales; solo Assert es obligatorioD Assert debe ir antes de Act para definir el comportamiento esperado antes de ejecutar
❓ ¿Para qué sirven los mocks en testing y qué problema resuelven?
A Los mocks aceleran el código de producción en entornos de prueba al eliminar operaciones lentasB Los mocks permiten reemplazar dependencias externas con objetos controlados, aislando la unidad bajo prueba y eliminando efectos secundarios realesC Los mocks son obligatorios en todos los tests; sin ellos los tests no son válidosD Los mocks sirven para generar datos de prueba aleatorios automáticamente
❓ ¿Por qué el 100% de code coverage no garantiza que el código está libre de bugs?
A Porque el coverage solo mide líneas ejecutadas, no que los comportamientos y combinaciones estén correctamente verificadosB Porque el 100% de coverage es imposible de alcanzar en proyectos realesC Porque el coverage solo funciona en lenguajes compilados, no en JavaScript o PythonD Porque tener más tests siempre introduce más bugs al código de producción
Patrones y Principios
❓ ¿Qué es el principio DRY y cuál es el problema concreto de violarlo?
A DRY significa escribir código corto. Violarlo produce funciones demasiado largasB DRY significa 'Don't Repeat Yourself': cada pieza de conocimiento debe tener una única representación. Violarlo obliga a actualizar la misma lógica en múltiples lugares cuando cambiaC DRY prohíbe usar bucles; hay que usar recursión para evitar repetir códigoD DRY es un principio de diseño de base de datos que prohíbe tener columnas duplicadas en tablas
❓ ¿Cuál es la diferencia entre un DTO (Data Transfer Object) y una Entidad de dominio?
A Son exactamente lo mismo; DTO es solo el nombre que se usa en el frontend y Entidad en el backendB Un DTO transporta datos entre capas sin lógica de negocio. Una Entidad representa un concepto del dominio con identidad y puede contener lógica de negocioC Las Entidades siempre mapean 1:1 con tablas de base de datos; los DTOs noD Los DTOs solo se usan en APIs REST; las Entidades solo en bases de datos relacionales
❓ ¿Qué es el patrón MVC y qué responsabilidad tiene cada capa?
A Model: base de datos. View: lógica de negocio. Controller: interfaz de usuarioB Model: datos y lógica de negocio. View: presentación al usuario. Controller: recibe peticiones, coordina Model y ViewC Model: interfaz de usuario. View: base de datos. Controller: lógica de negocioD MVC es un patrón solo para aplicaciones de escritorio; no aplica a aplicaciones web
❓ ¿Qué es la Inyección de Dependencias y qué problema concreto resuelve?
A Es una técnica para importar librerías externas sin declararlas en el archivo de configuración del proyectoB Es un patrón donde una clase recibe sus dependencias desde fuera en lugar de crearlas internamente, lo que reduce el acoplamiento y facilita el testingC Es una forma de optimizar el rendimiento inyectando valores directamente en memoria sin pasar por constructoresD Es exclusiva de frameworks como Angular; en .NET se gestiona diferente y no aplica el mismo concepto
Git
❓ ¿Cuál es la diferencia entre `git merge` y `git rebase`?
A Son equivalentes; `rebase` es solo el nombre antiguo de `merge`B `merge` crea un commit de fusión preservando el historial completo; `rebase` reaplica los commits sobre otra base creando un historial linealC `rebase` siempre es más seguro que `merge` y se recomienda para todas las situacionesD `merge` solo funciona con ramas locales; `rebase` es necesario para integrar ramas remotas
❓ ¿Qué hace `git stash` y cuándo lo usarías?
A Elimina permanentemente los cambios no commiteados del working directoryB Guarda temporalmente los cambios no commiteados en una pila, dejando el working directory limpio para poder cambiar de ramaC Crea un commit con mensaje 'WIP' en la rama actual con todos los cambiosD Copia los archivos modificados a un directorio de respaldo en el disco
❓ ¿Cuál es la diferencia entre `git reset` y `git revert`?
A Son equivalentes; `revert` es solo un alias de `reset` con `--hard`B `git reset` mueve el puntero HEAD (reescribe historial); `git revert` crea un nuevo commit que deshace los cambios sin reescribir el historialC `git revert` solo funciona en archivos individuales; `git reset` trabaja con commits completosD `git reset` es seguro para ramas remotas; `git revert` solo para ramas locales