Cómo pasar una entrevista de C#: principales preguntas y respuestas
Una entrevista para un puesto de desarrollador C# / .NET no solo es una prueba de conocimientos técnicos, sino también de la capacidad de pensar y explicar conceptos complejos en palabras sencillas. En este artículo, analizamos las preguntas más frecuentes que se hacen en las entrevistas, con ejemplos de código y explicaciones. El material será útil tanto para desarrolladores junior como middle.
1. ¿Cuál es la diferencia entre value types y reference types?
Esta es una pregunta básica pero importante. En C#, todos los tipos se dividen en dos categorías:
- Value types (tipos de valor) — se almacenan en la pila (stack), se copian al asignarse. Ejemplos:
int,double,struct,enum. - Reference types (tipos de referencia) — se almacenan en el heap, la variable almacena una referencia al objeto. Ejemplos:
class,string,array,delegate.
Ejemplo para la entrevista:
int a = 10;int b = a;b = 20;Console.WriteLine(a); // 10 — el valor no cambió
var obj1 = new MyClass { Value = 10 };var obj2 = obj1;obj2.Value = 20;Console.WriteLine(obj1.Value); // 20 — la referencia es la mismaEn la entrevista también suelen preguntar sobre boxing/unboxing — la conversión de un value type a object y viceversa. Trate de evitar esto en el código, ya que reduce el rendimiento.
2. ¿Qué son los delegados, eventos y expresiones lambda?
Los delegados son tipos que almacenan referencias a métodos. Los eventos son una envoltura sobre los delegados, utilizada para implementar el patrón "publicador-suscriptor".
Ejemplo de delegado:
public delegate void MyDelegate(string message);
public static void ShowMessage(string msg) => Console.WriteLine(msg);
MyDelegate del = ShowMessage;del("Hello from delegate");Ejemplo de evento:
public class Button{ public event EventHandler Click; public void Press() => Click?.Invoke(this, EventArgs.Empty);}Las expresiones lambda son una forma abreviada de escribir métodos anónimos. Se utilizan activamente en LINQ:
var numbers = new List<int> { 1, 2, 3, 4, 5 };var even = numbers.Where(x => x % 2 == 0).ToList();En la entrevista pueden preguntar: "¿Por qué es mejor usar eventos en lugar de delegados?" — respuesta: los eventos protegen la lista de suscriptores de modificaciones externas (no se puede llamar a Invoke desde fuera).
3. ¿Cómo funciona async/await y cuál es la diferencia con el multithreading?
Esta es una de las preguntas más populares. async/await es azúcar sintáctico para trabajar con operaciones asíncronas. No crea un nuevo hilo, sino que utiliza eficientemente el existente (hilo de UI o hilo del pool).
Puntos clave:
async— modificador del método que permite el uso deawait.await— suspende la ejecución del método hasta que la tarea se complete, sin bloquear el hilo.- El tipo de retorno — generalmente
TaskoTask<T>.
Ejemplo:
public async Task<string> GetDataAsync(){ using var client = new HttpClient(); string result = await client.GetStringAsync("https://api.example.com"); return result;}Diferencia con el multithreading: el multithreading (Thread, Task.Run) es la ejecución paralela de código en varios núcleos de CPU. Async/await es asincronía que libera el hilo para otras tareas mientras se espera (por ejemplo, la respuesta de un servidor).
Consejo: en la entrevista, ponga un ejemplo real — carga de datos desde la red o un archivo. Evite async void (excepto en manejadores de eventos) — esto puede provocar excepciones no controladas.