Introducción
Una entrevista para un puesto de desarrollador C# no es solo una prueba de sintaxis. Los empleadores quieren ver comprensión de la plataforma .NET, los principios de funcionamiento de CLR, la capacidad de escribir código eficiente y el conocimiento de enfoques modernos (async, LINQ, DI).
En este artículo analizaremos las mejores preguntas sobre C# de la A a la Z, desde tipos de datos básicos hasta temas complejos como la recolección de basura y la programación asíncrona. Cada pregunta va acompañada de una respuesta breve y un ejemplo de código para que puedas sentirte seguro en la entrevista.
1. Preguntas básicas: tipos, clases y memoria
1.1. ¿Cuál es la diferencia entre Value Type y Reference Type?
Value Type (int, struct, enum) se almacenan en la pila y se copian por valor. Reference Type (class, string, array) se almacenan en el montón, la variable contiene una referencia al objeto.
int a = 10;int b = a; // b es una copia, a y b son independientes
class MyClass { public int X; }MyClass obj1 = new MyClass { X = 5 };MyClass obj2 = obj1; // obj2 referencia al mismo objetoobj2.X = 10; // obj1.X también será 101.2. ¿Qué es Boxing y Unboxing?
Boxing es el empaquetado de un tipo de valor en un objeto (en el montón). Unboxing es el proceso inverso. El uso frecuente reduce el rendimiento.
int number = 42;object boxed = number; // Boxingint unboxed = (int)boxed; // Unboxing1.3. Hable sobre el recolector de basura (Garbage Collector).
El GC en .NET libera automáticamente la memoria de los objetos a los que no hay referencias. Funciona por generaciones (Gen 0, 1, 2). Los objetos de gran tamaño (>85 KB) van al Large Object Heap (LOH).
Consejo: No llame a GC.Collect() manualmente, ya que interfiere con las optimizaciones del GC.
2. POO y principios de diseño
2.1. Explique los principios SOLID.
- S — Single Responsibility: una clase debe tener una única razón para cambiar.
- O — Open/Closed: abierta para extensión, cerrada para modificación.
- L — Liskov Substitution: las subclases deben poder reemplazar correctamente a la clase base.
- I — Interface Segregation: muchas interfaces pequeñas son mejores que una grande.
- D — Dependency Inversion: las dependencias deben ser de abstracciones, no de clases concretas.
2.2. ¿Qué es Dependency Injection (DI)?
DI es un patrón en el que las dependencias se pasan a la clase desde el exterior (a través del constructor, método o propiedad). En .NET Core hay un contenedor DI integrado.
public interface ILogger{ void Log(string message);}
public class ConsoleLogger : ILogger{ public void Log(string message) => Console.WriteLine(message);}
public class OrderService{ private readonly ILogger _logger; public OrderService(ILogger logger) // DI a través del constructor { _logger = logger; }}3. LINQ, excepciones y cadenas
3.1. ¿Cómo funciona LINQ? ¿Qué es la ejecución diferida?
LINQ (Language Integrated Query) permite escribir consultas a colecciones, bases de datos (EF Core) y XML. La ejecución diferida significa que la consulta solo se ejecuta al recorrer el resultado (por ejemplo, mediante foreach o .ToList()).
var numbers = new List<int> { 1, 2, 3, 4, 5 };var query = numbers.Where(n => n > 2); // la consulta no se ejecutanumbers.Add(6); // agregamos después de crear la consultaforeach (var n in query) // ejecución aquí Console.WriteLine(n); // 3, 4, 5, 63.2. ¿Cuál es la diferencia entre String y StringBuilder?
String es un tipo inmutable. Cada operación de concatenación crea un nuevo objeto. StringBuilder utiliza un búfer mutable y es eficiente para múltiples cambios en la cadena.
// Malo (muchas asignaciones)string s = "";for (int i = 0; i &