Programación · n.º 8 entre los lenguajes más usados

Aprende C# desde cero

El lenguaje de .NET: aplicaciones de Windows, webs, servicios y videojuegos con Unity.

  • 10 lecciones
  • 10 ejercicios interactivos
  • 19 conceptos clave
  • 27,1 % lo usa*

Qué es C# y para qué sirve

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

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.

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.

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.

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

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.

Ejemplo práctico
Console.WriteLine(ConIva(100m));        // 121,00
Console.WriteLine(ConIva(100m, 10m));   // 110,0

static decimal ConIva(decimal precio, decimal iva = 21m)
{
    return precio * (1 + iva / 100);
}

Ejercicio

¿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.

Conceptos clave

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.

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.

Ejemplo práctico
var productos = new List<Producto>
{
    new("Teclado", 25.90m), new("Ratón", 12.50m), new("Cable", 4.99m),
};

var caros = productos
    .Where(p => p.Precio > 10)
    .OrderBy(p => p.Nombre)
    .Select(p => p.Nombre);

Console.WriteLine(string.Join(", ", caros));          // Ratón, Teclado
Console.WriteLine(productos.Sum(p => p.Precio));      // 43,39

record Producto(string Nombre, decimal Precio);

Ejercicio

Completa el método LINQ que filtra.

var baratos = productos.(p => p.Precio < 5);
Ver la solución

Respuesta: Where. Where devuelve los elementos que cumplen la condición.

Nivel 3 Avanzado

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.

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.

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.

  • Texto y programación

    Base64, URL y JSON

    Codifica y decodifica Base64 y URL, y valida o formatea JSON con la línea del error.

  • Texto y programación

    Comparar dos textos

    Encuentra las diferencias entre dos versiones de un texto, línea a línea y palabra a palabra.

Fuentes consultadas

* 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.