C# para principiantes — Misión
Secciones
Ajustes de lectura
Ninguna voz para este idioma en este navegador.
Más voces
Código y términos técnicos en inglés
Desactivado: la voz de la página lo lee todo, sin pausa entre dos voces.
Ninguna voz para este idioma en este navegador.
Más voces
Más voces: Microsoft Edge ofrece voces naturales en línea, y Windows (Configuración › Hora e idioma › Voz), macOS y Android instalan otras.
Por qué este curso
Sección titulada «Por qué este curso»Los demás cursos de lenguajes de este sitio dan por hecho que ya escribes C# o Java. Este no. Es para alguien que nunca ha programado, o que ha escrito un poco de Python, JavaScript o fórmulas de hoja de cálculo, y quiere aprender C# bien.
C# es un buen primer lenguaje: el compilador revisa tu programa antes de ejecutarlo y explica qué está mal, las herramientas son gratuitas en Windows, Linux y macOS, y el mismo lenguaje sirve para herramientas de línea de comandos, sitios web, juegos y aplicaciones de escritorio. El curso usa las versiones actuales: C# 14 y .NET 10, publicadas en noviembre de 2025.
Cómo funcionan las lecciones
Sección titulada «Cómo funcionan las lecciones»Cada lección presenta algunas nociones y, para cada una:
- la idea, con palabras sencillas;
- un programa corto que la usa, con la salida que imprimió de verdad;
- los errores que cometen los principiantes con ella, con el mensaje exacto del compilador;
- ejercicios, con una solución oculta bajo Solución: inténtalo primero y luego ábrela.
Los ejemplos usan datos pequeños y reales cuando ayudan: las notas de una guitarra, la afinación que usa Guitar Alchemist, los nombres de sus proyectos. No hace falta tocar música para seguirlos.
Al terminar este curso, sabré
Sección titulada «Al terminar este curso, sabré»- instalar el SDK de .NET, ejecutar un archivo C# y crear un proyecto, en Windows, Linux o macOS;
- leer un error del compilador y corregirlo;
- guardar valores en variables del tipo adecuado, convertir entre tipos y leer lo que se escribe con el teclado;
- tomar decisiones con
ifyswitch, y repetir trabajo con bucles; - dividir un programa en métodos, y trabajar con arrays y listas;
- modelar mis propios datos con clases y records, y gestionar errores con excepciones;
- leer y escribir archivos, probar mi código y usar un paquete NuGet.
| # | Lección | Nociones |
|---|---|---|
| 1 | Instalar .NET y ejecutar tu primer programa | SDK, dotnet run app.cs, instrucciones, proyectos, errores del compilador |
| 2 | Variables, tipos y entrada | int, double, decimal, string, bool, var, conversiones, interpolación, Console.ReadLine |
| 3 | Condiciones y bucles | if, switch, for, foreach, while, break, el depurador |
| 4 | Métodos, arrays y listas | parámetros, valores de retorno, arrays, List<T>, primeros pasos con null |
| 5 | Clases y objetos | campos, propiedades, constructores, métodos, static |
| 6 | Records, structs y enums | tipos de valor y de referencia, igualdad, enum |
| 7 | Interfaces y herencia | interface, abstract, override, polimorfismo |
| 8 | Excepciones y seguridad frente a null | try/catch/finally, throw, tipos de referencia que aceptan valores null |
| 9 | Colecciones y LINQ | Dictionary<TKey, TValue>, HashSet<T>, Where, Select, OrderBy |
| 10 | Archivos y texto | File, Path, leer un archivo CSV de los proyectos de Guitar Alchemist |
| 11 | Pruebas unitarias | xUnit, dotnet test, probar los métodos de las lecciones anteriores |
| 12 | Un pequeño proyecto | una solución con una biblioteca, una app de consola y pruebas, un paquete NuGet, un primer vistazo a async |
| — | Diario |
Lo más destacado del diario
Sección titulada «Lo más destacado del diario»El diario recoge lo que la escritura y las pruebas de este curso sacaron a la luz. Estos son los hallazgos que cambian la forma de escribir o ejecutar un programa; cada fila enlaza con la lección que lo enseña y con la entrada del diario que contiene la medición.
| Lo que encontró el diario | Por qué importa | Ver |
|---|---|---|
Un Writeline mal escrito (CS0117) solo se señala una vez corregidos el ; y las comillas que faltan en el mismo programa: los errores de sintaxis ocultan los demás |
Corregir un error puede hacer aparecer otros nuevos; es un avance, no un retroceso | Lección 1, diario |
double.TryParse("1.5") depende de la cultura: true y 15 en es-ES, donde el punto separa los miles, false en fr-FR |
El mismo programa lee un número distinto en una máquina española o francesa | Lección 2, diario |
Las advertencias solo se muestran cuando el SDK compila: un segundo dotnet run de un archivo sin cambios no muestra ninguna, ni siquiera con --no-cache; dotnet clean las hace volver |
Una advertencia que desaparece en la ejecución siguiente no está corregida | Lección 3, diario |
El literal 0 se convierte en una enumeración sin cast, y CS8524 avisa de una expresión switch que tiene un brazo por nombre |
Una variable de enumeración puede contener un número sin nombre: el programa de la lección falla con 7 | Lección 6, diario |
Un borrador decía que shape[i].Fret += 2 sobre una lista de readonly record struct da CS1612; una sonda compilada antes de publicar dio CS8852 |
Cada salida y cada mensaje de error del curso se pega desde una ejecución, nunca se escribe de memoria | Lección 6, diario |
En Guitar Alchemist, el ToString() => Name de ChordTemplate no es sealed: sus records derivados muestran todas sus propiedades en lugar del nombre del acorde |
El override de la lección 7 se encuentra con los records de la lección 6 en código real; un punto de llamada de GA registra el volcado. Aún no comunicado a GA |
Lección 7, tabla QA |
Una advertencia de nulabilidad señala por dónde entra null, no dónde falla el programa: CS8618 está en la declaración de la propiedad, y la línea que falla no tiene ninguna advertencia |
Corrige cada advertencia donde está, aunque esté lejos del fallo | Lección 8, diario |
Guitar Alchemist silencia quince advertencias de nulabilidad en NoWarn, dos veces. Su código no tiene ninguna que ocultar, pero un archivo de prueba con siete errores de nulabilidad compiló sin advertencias |
Silenciar una advertencia también silencia los errores que aún están por venir. Aún no comunicado a GA | Lección 8, tabla QA |
El foreach de un diccionario sigue el orden de inserción solo hasta el primer Remove: una clave añadida después ocupa el lugar de la clave quitada |
Un resultado ordenado guardado en un Dictionary sigue ordenado por casualidad; ordena cuando el orden importa |
Lección 9, diario |
| Tres de los cuatro archivos YAML que leen los servicios de conocimiento musical de Guitar Alchemist no se cargan; cada cargador captura la excepción y sigue con un solo elemento por defecto | Un catch que solo muestra un mensaje oculta el error: GA cuenta 16 artistas y nada falla. Comunicado en la issue 797 de GA; corrección propuesta en la PR 808 de GA |
Lección 9, tabla QA |
Una ruta relativa parte del directorio actual, no del archivo del programa: l10_where.cs encuentra data/ga-projects.csv cuando dotnet run arranca en code/csharp-beginner, y no lo encuentra desde la raíz del repositorio |
El mismo programa encuentra su archivo o no según la carpeta desde la que arranca; una ruta construida a partir de EntryPointFileDirectoryPath funciona desde las dos |
Lección 10, diario |
La cadena de formato con la que Guitar Alchemist escribe su CSV de naturalidad sigue la cultura de la máquina: con fr-FR, 2.50 se convierte en 2,50, y una fila de 6 valores se corta en 8 |
Un archivo escrito en una máquina francesa no se vuelve a leer con Split(','); escribe los números con CultureInfo.InvariantCulture. Corrección propuesta en la PR 811 de GA |
Lección 10, tabla QA |
| Las pruebas de Guitar Alchemist para sus servicios YAML pasan mientras tres de los cuatro archivos no se cargan: tres pruebas se omiten, y las demás comprueban «más que cero», lo que cumple el único elemento por defecto | Una prueba que solo comprueba «más que cero» no ve un valor de repliegue; comprueba el valor real. Corrección propuesta en la PR 808 de GA | Lección 11, tabla QA |
Con los argumentos invertidos, Assert.Equal llama «Expected» al resultado del método y «Actual» al valor de la prueba; la regla de analizador xUnit2000 avisa antes de que se ejecuten las pruebas |
El valor esperado va primero; lee también las advertencias de la compilación de las pruebas | Lección 11, diario |
dotnet test en la carpeta de una solución solo compila los proyectos de pruebas y lo que referencian: con un error de compilación en la aplicación de consola, las pruebas pasan igualmente y terminan con el código 0 |
Ejecuta también dotnet build antes de fiarte de unas pruebas en verde |
Lección 12, diario |
En el Directory.Build.props de Guitar Alchemist, las líneas PackageReference Update pensadas para alinear las versiones de los paquetes no cambian nada: el archivo se importa antes que los elementos propios de los proyectos |
Comprueba la versión que elige una restauración; Directory.Build.targets o la gestión centralizada de paquetes hacen lo que esas líneas pretenden. Corrección propuesta en la PR 812 de GA |
Lección 12, tabla QA |
Requisitos previos
Sección titulada «Requisitos previos»- Un ordenador con Windows 10 u 11, una distribución de Linux reciente (o WSL), o macOS 14 o posterior.
- Alrededor de 1 GB de disco para el SDK de .NET.
- Una terminal: la lección 1 explica cómo abrir una.
- Un editor: Visual Studio Code con la extensión C# Dev Kit, Visual Studio en Windows, o JetBrains Rider. La lección 1 los compara.
Después de este curso
Sección titulada «Después de este curso»Un curso de C# avanzado, escrito al mismo tiempo que este, empieza donde este termina: la memoria, el recolector de basura, async por dentro y el rendimiento medido. Los cursos Java para desarrolladores C# y Rust para desarrolladores C#/Java parten de C#.
Recursos
Sección titulada «Recursos»- Documentación de C#, con su recorrido por C# y sus fundamentos.
- Referencia del lenguaje C#: cada palabra clave, operador y error del compilador.
- Información general de la CLI de .NET: el comando
dotnet. - Aplicaciones basadas en archivos: ejecutar un único archivo
.cs.