Con el entorno de desarrollo ya preparado, ha llegado el momento de crear tu primer proyecto real: BiblioTechConsola, la primera piedra del sistema BiblioTech que construiremos a lo largo de todo el curso. En esta lección crearás el proyecto paso a paso, escribirás y ejecutarás un "Hola Mundo", y analizaremos línea a línea cada parte del código, incluyendo tanto la forma clásica como la forma moderna (top-level statements) de escribirlo. Entender bien esta estructura mínima es fundamental, porque será la base sobre la que se apoyará todo el código que escribas en los próximos módulos.
Contenido
- Crear el proyecto BiblioTechConsola paso a paso
- Escribir y ejecutar el primer Hola Mundo
- Explicación línea a línea de la versión clásica
- La variante moderna: top-level statements
- Compilar y ejecutar con
dotnet run
Crear el proyecto BiblioTechConsola paso a paso
Abre una terminal en la carpeta donde quieras guardar tus proyectos del curso y ejecuta:
Este comando, como vimos en la lección anterior, crea una carpeta BiblioTechConsola con la
estructura básica de un proyecto de consola:
Abre la carpeta BiblioTechConsola con tu editor (VS Code, Visual Studio o Rider) y localiza
el archivo Program.cs. Este archivo contiene, por defecto, un pequeño programa de ejemplo
generado automáticamente por la plantilla:
Esta es la versión moderna (con top-level statements) que genera dotnet new console
en las versiones actuales del SDK. Vamos a modificarla para que hable de BiblioTech:
Puedes eliminar el comentario generado automáticamente (la línea que empieza por //); no es
necesario para que el programa funcione, es solo información orientativa que añade la
plantilla.
Escribir y ejecutar el primer Hola Mundo
Guarda el archivo Program.cs con el contenido anterior y, desde la terminal, dentro de la
carpeta del proyecto, ejecuta:
Deberías ver en la terminal:
¡Enhorabuena! Acabas de escribir y ejecutar tu primer programa en C#. Aunque parezca muy simple, este pequeño programa ya pone en juego varios conceptos fundamentales del lenguaje que vamos a diseccionar a continuación.
Explicación línea a línea de la versión clásica
Antes de la introducción de los top-level statements (a partir de C# 9, año 2020), todo programa de consola en C# debía escribirse con una estructura más explícita. Es muy importante conocer esta forma clásica, porque:
- Es la que encontrarás en muchísimo código existente, documentación y tutoriales antiguos.
- Es, en realidad, lo que el compilador genera "por debajo" incluso cuando usamos la forma moderna y simplificada.
Así se vería nuestro mismo programa en su forma clásica y completa:
using System;
namespace BiblioTechConsola
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Bienvenido a BiblioTechConsola!");
}
}
}Vamos a explicar cada línea, de arriba a abajo:
| Línea | Qué es | Explicación |
|---|---|---|
using System; |
Directiva using |
Indica que este archivo va a usar tipos del espacio de nombres System, donde vive, entre otras cosas, la clase Console. Sin esta línea, tendríamos que escribir System.Console.WriteLine(...) cada vez. |
namespace BiblioTechConsola |
Declaración de espacio de nombres | Un espacio de nombres (namespace) agrupa código relacionado bajo un mismo nombre, evitando conflictos con clases del mismo nombre definidas en otras bibliotecas. Suele coincidir con el nombre del proyecto. |
class Program |
Declaración de clase | En C#, todo código ejecutable vive dentro de una clase. Por convención, la clase que contiene el punto de entrada del programa se llama Program. No profundizaremos en qué es una clase todavía: eso llega en el Módulo 3; de momento basta con saber que es "el contenedor" obligatorio del código. |
static void Main(string[] args) |
El método Main |
Este es el punto de entrada del programa: la primera y única instrucción que el CLR ejecuta al arrancar. static significa que se puede llamar sin necesitar un objeto de tipo Program (tema de POO, Módulo 3); void indica que el método no devuelve ningún valor; string[] args es un array de argumentos de línea de comandos, que veremos en la próxima lección. |
Console.WriteLine("..."); |
Instrucción | La única línea de código "real" del programa: escribe el texto indicado en la consola y salta de línea. |
Las llaves { } |
Delimitadores de bloque | Cada { abre un bloque de código y su } correspondiente lo cierra. El espacio de nombres, la clase y el método Main son, cada uno, un bloque delimitado por llaves. |
Es importante fijarse en la anidación: el espacio de nombres contiene la clase, la clase
contiene el método Main, y el método Main contiene la instrucción Console.WriteLine.
Esta jerarquía de llaves es la estructura general de (casi) cualquier archivo .cs que
escribas, y la retomaremos con más detalle en la próxima lección, "Sintaxis y Estructura
Básica".
La variante moderna: top-level statements
Desde C# 9, el lenguaje permite omitir todo el código "de andamiaje" (namespace, clase,
método Main) cuando el programa es simple, dejando solo las instrucciones que realmente
importan. A esto se le llama top-level statements (instrucciones de nivel superior).
Es justo lo que generó dotnet new console al crear tu proyecto:
¿Qué ha pasado con todo lo demás? El compilador de C# sigue generando por debajo la misma
estructura (namespace, class Program, static void Main) de forma automática; simplemente
no tienes que escribirla tú mismo. Es exactamente el mismo programa, solo que con menos
código repetitivo (boilerplate) que escribir y leer.
| Aspecto | Forma clásica | Top-level statements |
|---|---|---|
| Código que hay que escribir | Namespace + clase + método Main + instrucciones |
Solo las instrucciones |
| Resultado al compilar | Idéntico | Idéntico |
| Cuándo usarla | Programas grandes con varias clases, o cuando se necesita más de un punto de entrada explícito | Programas de consola sencillos, scripts, proyectos de aprendizaje |
| Disponible desde | Siempre | C# 9 (2020) en adelante |
En este curso usaremos, por defecto, top-level statements para los ejemplos de consola
sencillos (especialmente en este primer módulo), porque permiten centrarse en el concepto que
se está aprendiendo sin distraerse con código repetitivo. Cuando lleguemos a la Programación
Orientada a Objetos (Módulo 3), donde definiremos nuestras propias clases (Libro, Socio,
Prestamo), volverá a ser habitual ver estructuras más parecidas a la forma clásica,
combinadas con Main como punto de entrada.
¿Puedo usar args (argumentos de línea de comandos) con top-level statements?
Sí. Aunque no se declare explícitamente string[] args, el sistema pone a tu disposición una
variable implícita llamada args si la necesitas:
if (args.Length > 0)
{
Console.WriteLine($"Hola, {args[0]}!");
}
else
{
Console.WriteLine("Bienvenido a BiblioTechConsola!");
}No te preocupes si no entiendes todavía el if o la interpolación $"...": los veremos en
detalle en los módulos 2 y 6 respectivamente (control de flujo y cadenas de texto). Es solo
para que sepas que la variable args sigue disponible aunque no se vea el método Main
explícitamente.
Compilar y ejecutar con dotnet run
Ya usamos dotnet run para ejecutar nuestro programa, pero conviene entender exactamente qué
ocurre "bajo el capó" cuando lo lanzamos:
- Restauración de dependencias:
dotnetcomprueba si el proyecto necesita descargar paquetes externos (en nuestro caso, ninguno todavía) y los prepara si hace falta. - Compilación: el compilador de C# traduce el código fuente (
Program.cs) a lenguaje intermedio (IL), generando un ejecutable dentro de la carpetabin/. - Ejecución: el CLR carga ese ejecutable y lo ejecuta, compilando el IL a código máquina sobre la marcha (compilación JIT, mencionada en la primera lección).
Si solo quieres compilar sin ejecutar (por ejemplo, para comprobar que no hay errores sin ver la salida en pantalla), puedes usar:
Y si quieres ejecutar directamente el ejecutable ya compilado (sin pasar de nuevo por todo el
proceso de compilación), puedes localizarlo dentro de bin/Debug/net8.0/ y ejecutarlo
directamente desde ahí. En la práctica, durante el aprendizaje, dotnet run es la forma más
cómoda y la que usaremos durante todo el curso.
Modificando y volviendo a ejecutar
Un flujo de trabajo habitual mientras aprendes es: editar Program.cs, guardar, y volver a
ejecutar dotnet run. Por ejemplo, prueba a añadir una segunda línea a tu programa:
Console.WriteLine("Bienvenido a BiblioTechConsola!");
Console.WriteLine("Sistema de gestion de biblioteca");Al ejecutar dotnet run de nuevo, verás ambas líneas en la terminal, una debajo de la otra,
porque WriteLine siempre añade un salto de línea al final de lo que escribe.
Errores Comunes y Consejos
- Olvidar el punto y coma
;al final de una instrucción: es uno de los errores más frecuentes al empezar. El compilador mostrará un mensaje de error indicando la línea exacta donde falta. - Guardar el archivo pero ejecutar desde la carpeta equivocada:
dotnet rundebe ejecutarse desde la carpeta del proyecto (donde está el archivo.csproj), no desde una carpeta superior o inferior. - Pensar que hay que escribir siempre la forma clásica completa: no es así; para
programas sencillos, los top-level statements son perfectamente válidos y son, de hecho,
la forma que genera la plantilla oficial de
dotnet new console. - Confundir
Console.WriteconConsole.WriteLine:Writeescribe el texto sin saltar de línea;WriteLinesí salta de línea al final. Si dos mensajes seguidos aparecen "pegados" en la misma línea, probablemente usasteWriteen lugar deWriteLine. - Consejo: cuando el compilador muestre un error, léelo con calma: normalmente indica el archivo, la línea y una descripción bastante precisa de qué está mal (por ejemplo, "falta un punto y coma" o "no se encuentra ese nombre").
Ejercicios
-
Crea el proyecto
BiblioTechConsolasiguiendo los pasos de esta lección (si no lo has hecho ya) y modificaProgram.cspara que, usando top-level statements, escriba dos líneas: una con el nombre del sistema ("BiblioTechConsola") y otra con un mensaje de bienvenida a tu elección. Ejecuta el programa condotnet runy comprueba el resultado. -
Reescribe el programa del ejercicio anterior usando la forma clásica completa (
using,namespace,class Program,static void Main), manteniendo el mismo comportamiento (las mismas dos líneas de salida). Ejecútalo y comprueba que el resultado en pantalla es idéntico al del ejercicio 1. -
Usando la variable implícita
argsen la versión de top-level statements, escribe un programa que muestre"Bienvenido a BiblioTechConsola!"si no se pasa ningún argumento, o un saludo personalizado si se pasa uno. (Pista: en la mayoría de editores puedes configurar los argumentos de línea de comandos en las opciones de depuración/ejecución; si no sabes cómo hacerlo todavía, no te preocupes, céntrate en que el código compile correctamente).
Soluciones
-
Contenido de
Program.cs:Console.WriteLine("BiblioTechConsola"); Console.WriteLine("Bienvenido al sistema de gestion de la biblioteca!");Al ejecutar
dotnet run, la terminal debería mostrar ambas líneas, una debajo de la otra. -
Versión clásica equivalente:
using System; namespace BiblioTechConsola { class Program { static void Main(string[] args) { Console.WriteLine("BiblioTechConsola"); Console.WriteLine("Bienvenido al sistema de gestion de la biblioteca!"); } } }El resultado en pantalla es exactamente el mismo que en el ejercicio 1, porque ambas formas se compilan, en esencia, al mismo programa.
-
Ejemplo de solución:
if (args.Length > 0) { Console.WriteLine($"Hola, {args[0]}! Bienvenido a BiblioTechConsola."); } else { Console.WriteLine("Bienvenido a BiblioTechConsola!"); }Si el programa se ejecuta sin argumentos, se mostrará el mensaje genérico; si se le pasa un argumento (por ejemplo, un nombre), se mostrará el saludo personalizado. No es necesario entender todavía en profundidad el
ifni la interpolación$"...": los veremos con detalle más adelante en el curso.
Conclusión
En esta lección has creado tu primer proyecto real del curso, BiblioTechConsola, y has
aprendido a distinguir entre la estructura clásica de un programa en C# (namespace, clase,
método Main) y la forma moderna con top-level statements, entendiendo que ambas
producen exactamente el mismo resultado. También has practicado el ciclo completo de editar y
ejecutar con dotnet run.
Ahora que sabes crear y ejecutar programas, es el momento de profundizar en las reglas de sintaxis que gobiernan cualquier archivo C#: mayúsculas y minúsculas, bloques delimitados por llaves, tipos de comentarios y convenciones de nomenclatura. Eso es precisamente lo que veremos en la siguiente lección, Sintaxis y Estructura Básica.
Curso de Programación en C#
Módulo 1: Introducción a C#
- Introducción a C#
- Configuración del Entorno de Desarrollo
- Programa Hola Mundo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Arrays y Cadenas de Texto
Módulo 2: Estructuras de Control
Módulo 3: Programación Orientada a Objetos
- Clases y Objetos
- Métodos
- Constructores y Destructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
- Structs y Records: Tipos por Valor y por Referencia
Módulo 4: Conceptos Avanzados de C#
- Interfaces
- Delegados y Eventos
- Pattern Matching y Características Modernas de C#
- Genéricos
- Colecciones
- LINQ (Consulta Integrada en el Lenguaje)
- Programación Asíncrona
Módulo 5: Trabajando con Datos
- Entrada/Salida de Archivos
- Serialización
- Conectividad con Bases de Datos
- Entity Framework
- Trabajo con JSON y Consumo de APIs REST
Módulo 6: Temas Avanzados
- Reflexión
- Atributos
- Programación Dinámica
- Gestión de Memoria y Recolección de Basura
- Multihilo y Programación Paralela
Módulo 7: Construcción de Aplicaciones
- Formularios de Windows
- WPF (Windows Presentation Foundation)
- ASP.NET Core
- Blazor
- Xamarin y .NET MAUI
Módulo 8: Mejores Prácticas y Patrones de Diseño
- Estándares de Codificación y Mejores Prácticas
- Patrones de Diseño
- Inyección de Dependencias e Inversión de Control
- Pruebas Unitarias
- Revisión y Refactorización de Código
