C# es el lenguaje principal de .NET, la plataforma gratuita y multiplataforma de Microsoft. Con él se hacen aplicaciones de Windows, webs y APIs con ASP.NET Core, servicios en la nube y videojuegos con el motor Unity. Su sintaxis se parece a la de Java.
Aplicaciones de Windows y de escritorio
Webs y APIs con ASP.NET Core
Videojuegos con Unity
Para empezar: Instala el SDK de .NET, crea un proyecto con dotnet new console y ejecútalo con dotnet run.
Nivel 1 Básico
1
Lección 1 · Básico
Tu primer programa
Con el SDK de .NET instalado, dotnet new console crea un proyecto y dotnet run lo compila y lo ejecuta. El archivo Program.cs puede empezar directamente con instrucciones, sin declarar clases (instrucciones de nivel superior).
Console.WriteLine() escribe una línea en la consola.
Ejemplo práctico
// En la terminal:
// dotnet new console -o MiApp
// cd MiApp
// dotnet run
// Program.cs
Console.WriteLine("¡Hola, mundo!");
Console.WriteLine(2 + 3); // 5
Ejercicio
Completa la instrucción que escribe una línea.
Console.("Hola");
Ver la solución
Respuesta:WriteLine. Console.WriteLine() escribe el texto y salta de línea.
2
Lección 2 · Básico
Variables, tipos e interpolación
C# es de tipado estático: int, double, decimal (para dinero, sin errores de redondeo binario), bool y string. Con var el compilador deduce el tipo.
Un texto que empieza por $ permite meter variables entre llaves: es la interpolación de cadenas.
Ejemplo práctico
string nombre = "Ana";
int edad = 30;
decimal precio = 19.99m; // la m indica decimal
var socio = true; // bool
Console.WriteLine($"{nombre} tiene {edad} años");
Console.WriteLine($"Total: {precio * 3}"); // Total: 59,97 (con Windows en español)
Ejercicio
¿Qué tipo es el más adecuado para importes de dinero en C#?
Ver la solución
Respuesta: decimal. decimal trabaja en base 10 y evita errores de redondeo típicos de double con céntimos.
3
Lección 3 · Básico
Condiciones y switch
if, else if y else deciden qué se ejecuta. Los textos se comparan con ==, que en C# compara su contenido.
La expresión switch devuelve un valor según el caso, y _ recoge todos los que no coinciden con los anteriores.
Ejemplo práctico
int nota = 7;
string resultado = nota switch
{
>= 9 => "Sobresaliente",
>= 5 => "Aprobado",
_ => "Suspenso",
};
Console.WriteLine(resultado); // Aprobado
Ejercicio
En una expresión switch, ¿qué significa _?
Ver la solución
Respuesta: Cualquier otro caso. _ es el patrón de descarte: coincide con todo lo que no encaje en los casos anteriores.
4
Lección 4 · Básico
Listas y bucles
List<T> es una lista que crece según añades elementos; el tipo va entre < y >. Count dice cuántos hay.
foreach recorre cada elemento; for usa un contador cuando necesitas la posición.
Ejemplo práctico
var compra = new List<string> { "pan", "leche" };
compra.Add("huevos");
foreach (var producto in compra)
{
Console.WriteLine($"- {producto}");
}
Console.WriteLine(compra.Count); // 3
Ejercicio
Completa el bucle que recorre la lista.
(var p in compra)
{
Console.WriteLine(p);
}
Ver la solución
Respuesta:foreach. foreach (var x in lista) toma cada elemento por turno.
Nivel 2 Intermedio
5
Lección 5 · Intermedio
Métodos
Un método agrupa código reutilizable. Se declara con el tipo que devuelve (void si nada), el nombre y los parámetros con su tipo. Los parámetros pueden tener valor por defecto.
En un programa con instrucciones de nivel superior puedes declarar funciones locales al final del archivo.
¿Qué devuelve ConIva(200m) con el IVA por defecto del 21 %?
Ver la solución
Respuesta: 242,00. 200 × 1,21 = 242. Como es decimal, conserva los decimales del cálculo y, con el sistema en español, se muestra como 242,00.
6
Lección 6 · Intermedio
Clases, propiedades y records
Una clase agrupa datos y comportamiento. Las propiedades ({ get; set; }) exponen los datos y permiten controlar cómo se leen y se cambian.
Un record es una forma corta de declarar tipos que solo guardan datos; compara por valor y su ToString() muestra el contenido.
Ejemplo práctico
var cuenta = new Cuenta("Ana");
cuenta.Ingresar(50);
Console.WriteLine(cuenta.Saldo); // 50
var p = new Producto("Ratón", 12.5m);
Console.WriteLine(p); // Producto { Nombre = Ratón, Precio = 12,5 }
class Cuenta(string titular)
{
public string Titular { get; } = titular;
public decimal Saldo { get; private set; }
public void Ingresar(decimal cantidad) => Saldo += cantidad;
}
record Producto(string Nombre, decimal Precio);
Ejercicio
Con public decimal Saldo { get; private set; }, ¿quién puede cambiar el saldo?
Ver la solución
Respuesta: Solo el código de la propia clase. El set es privado: fuera de la clase solo se puede leer.
7
Lección 7 · Intermedio
Consultas con LINQ
LINQ añade a las colecciones métodos para filtrar (Where), transformar (Select), ordenar (OrderBy) o sumar (Sum), usando lambdas como p => p.Precio > 10.
Funciona igual con listas, con XML o con bases de datos a través de Entity Framework.
Respuesta:Where. Where devuelve los elementos que cumplen la condición.
Nivel 3 Avanzado
8
Lección 8 · Avanzado
Interfaces y herencia
Una interfaz declara qué métodos debe tener una clase; una clase puede implementar varias. La herencia (: ClaseBase) reutiliza el código de otra clase, y virtual y override permiten cambiar un método heredado.
Por convención, los nombres de interfaz empiezan por I: IAvisador, IRepositorio.
Ejemplo práctico
IFigura[] figuras = { new Circulo(1), new Rectangulo(2, 3) };
foreach (var f in figuras) Console.WriteLine(f.Area().ToString("F2"));
interface IFigura
{
double Area();
}
record Circulo(double Radio) : IFigura
{
public double Area() => Math.PI * Radio * Radio;
}
record Rectangulo(double Ancho, double Alto) : IFigura
{
public double Area() => Ancho * Alto;
}
Ejercicio
¿De cuántas interfaces puede implementar una clase en C#?
Ver la solución
Respuesta: De varias. Una clase hereda de una sola clase base, pero puede implementar todas las interfaces que quiera.
9
Lección 9 · Avanzado
Excepciones y null seguro
try, catch y finally tratan los errores. Para convertir textos sin excepciones, métodos como int.TryParse devuelven true o false.
Con los tipos de referencia que aceptan null (activados por defecto en proyectos nuevos), string? indica que puede faltar, y el compilador avisa si lo usas sin comprobarlo. ?. y ?? ayudan a manejarlo.
Ejemplo práctico
if (int.TryParse("42", out int numero))
Console.WriteLine(numero + 1); // 43
string? apodo = null;
Console.WriteLine(apodo?.ToUpper() ?? "Sin apodo");
try
{
var texto = File.ReadAllText("datos.txt");
}
catch (FileNotFoundException)
{
Console.WriteLine("No existe el archivo");
}
Ejercicio
¿Qué indica el ? en string? apodo?
Ver la solución
Respuesta: Que puede valer null. string? es un texto que puede ser null; el compilador te pedirá comprobarlo antes de usarlo.
10
Lección 10 · Avanzado
Programación asíncrona con async/await
Las operaciones lentas, como descargar algo, devuelven una Task. Con await esperas su resultado sin bloquear el programa, y el método que lo usa se marca con async.
Así una aplicación de escritorio no se congela mientras descarga y un servidor puede atender otras peticiones a la vez.
Ejemplo práctico
using var http = new HttpClient();
try
{
string html = await http.GetStringAsync("https://example.com");
Console.WriteLine($"Descargados {html.Length} caracteres");
}
catch (HttpRequestException e)
{
Console.WriteLine($"Error de red: {e.Message}");
}
Ejercicio
Completa para esperar el resultado de la tarea.
string texto = http.GetStringAsync(url);
Ver la solución
Respuesta:await. await espera a que termine la Task y devuelve su resultado sin bloquear el hilo.
¿Has terminado? Sigue practicando
Repasa los conceptos en el diccionario, practica con estas herramientas o prueba otro lenguaje: las ideas que has aprendido (variables, condiciones, funciones, objetos…) te servirán en cualquiera.
* Porcentaje de personas que dijeron haber usado C# en la Stack Overflow Developer Survey 2026: Technology (pregunta sobre lenguajes de programación, de scripts y de marcado; todas las respuestas). El progreso de las lecciones se guarda solo en este navegador.
¿Nos dejas medir las visitas?
Con tu permiso usamos Google Analytics, que guarda cookies, para saber cuántas personas visitan la web y qué páginas les resultan útiles. No usamos cookies de publicidad y tus archivos nunca salen de tu navegador. Puedes cambiar de opinión cuando quieras en «Configurar cookies», al pie de la página. Más información.