Cómo aprobar una entrevista de C#: guía completa con ejemplos de código

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué la entrevista de C# no es un examen, sino un diálogo

\n\n

Imagina: estás sentado frente a un tech lead o un desarrollador senior. Él te mira no como a un enemigo, sino como a un futuro colega. Pero en tu cabeza hay niebla, te sudan las manos, y ante la pregunta sobre IDisposable de repente olvidas qué es siquiera. ¿Te suena familiar?

\n\n

La entrevista de C# no es un examen escolar donde solo necesitas "adivinar la letra". Es una prueba de tu pensamiento ingenieril, tu capacidad de razonar y, por supuesto, tus conocimientos básicos de la plataforma .NET. En este artículo analizaremos los temas principales que realmente preguntan en las entrevistas (spoiler: el 80% de las preguntas se repiten una y otra vez).

\n\n

Conceptos básicos que debes saber de memoria

\n\n

Si tienes una entrevista en una hora y no hay tiempo para prepararte, lee esta sección. Es el "pan de cada día" del desarrollador C#. Sin estos conocimientos no te contratarán ni como junior.

\n\n

1. Tipos de datos: Value vs Reference

\n\n

Esta es, probablemente, la pregunta más popular. El entrevistador no solo quiere escuchar "int es de valor, class es de referencia". Le importa si entiendes cómo funciona esto bajo el capó.

\n\n
// Ejemplo que suelen dar en las entrevistas\nstruct Point {\n    public int X;\n    public int Y;\n}\n\nclass PointClass {\n    public int X;\n    public int Y;\n}\n\nvoid Main() {\n    Point p1 = new Point { X = 10, Y = 20 };\n    Point p2 = p1;\n    p2.X = 999;\n    Console.WriteLine(p1.X); // 10 — copia\n\n    PointClass pc1 = new PointClass { X = 10, Y = 20 };\n    PointClass pc2 = pc1;\n    pc2.X = 999;\n    Console.WriteLine(pc1.X); // 999 — referencia\n}
\n\n

Punto clave: struct se copia por completo, class se pasa por referencia. Y sí, string es un tipo de referencia, pero se comporta como value debido a su inmutabilidad. También suelen preguntar sobre esto.

\n\n

2. Boxing y Unboxing

\n\n

Un tema sencillo, pero que les encanta. Imagina que colocas un tipo value (int) en un object. Ocurre el empaquetado (boxing). Cuando lo recuperas, desempaquetado (unboxing). Esto es costoso en rendimiento.

\n\n
int number = 42;\nobject boxed = number; // boxing\nint unboxed = (int)boxed; // unboxing
\n\n

En proyectos modernos esto es raro, pero conocer el mecanismo demuestra que entiendes cómo .NET gestiona la memoria.

\n\n

3. Interfaces y clases abstractas

\n\n

Pregunta clásica: "¿Cuándo usar interface y cuándo abstract class?"

\n\n
    \n
  • Interface — contrato. Si tienes diferentes clases que deben poder hacer lo mismo (por ejemplo, volar: avión, pájaro, dron).
  • \n
  • Clase abstracta — implementación base. Si las clases tienen lógica común (por ejemplo, todos los animales respiran, pero de diferentes maneras).
  • \n
\n\n
public interface IFlyable {\n    void Fly();\n}\n\npublic abstract class Animal {\n    public abstract void MakeSound();\n    public void Breathe() => Console.WriteLine("Inhalar-exhalar");\n}
\n\n

En C# 8.0+ las interfaces tienen implementación por defecto, pero en la entrevista es mejor hablar del enfoque clásico.

\n\n

Preguntas avanzadas: dónde está la trampa

\n\n

Cuando lo básico está cubierto, el entrevistador empieza a "profundizar". Estos son los temas que más suelen causar bloqueo.

\n\n

4. Async/Await y subprocesos

\n\n

Muchos confunden asincronía y multitarea. Recuerda: async/await se trata de liberar el subproceso, no de crear uno nuevo.

\n\n
public async Task<string> GetDataAsync() {\n    using HttpClient client = new HttpClient();\n    // El subproceso se libera mientras esperamos la respuesta\n    string result = await client.GetStringAsync("https://example.com");\n    return result;\n}
\n\n

A menudo preguntan sobre ConfigureAwait(false). Respuesta: se necesita para no volver al contexto de sincronización original (por ejemplo, en el subproceso de UI de WPF). En bibliotecas, úsalo siempre; en aplicaciones, con precaución.

\n\n

5. LINQ: de lo simple

Blogs

Book Recommendations