Mi primer programa en C#: guía paso a paso para principiantes

D
DanisCh
• 11 min de lectura
Mi primer programa en C#: guía paso a paso para principiantes
C#

C# (pronunciado "C sharp") es uno de los lenguajes de programación más completos y versátiles del mercado. Lo creó Microsoft y se usa para desarrollar aplicaciones de escritorio con Windows, aplicaciones web con ASP.NET, videojuegos con Unity, aplicaciones móviles y mucho más. Si estás empezando desde cero, esta guía te lleva de la instalación hasta tu primer programa funcionando, explicando cada línea del camino.

Qué necesitas instalar

Para programar en C# necesitas dos cosas: el SDK de .NET (que incluye el compilador y todas las herramientas) y un editor de código.

Instalar el SDK de .NET

El SDK de .NET es gratuito y funciona en Windows, macOS y Linux.

  1. Ve a dotnet.microsoft.com/download
  2. Descarga la versión más reciente del SDK (no el Runtime, sino el SDK completo)
  3. Ejecuta el instalador y sigue los pasos

Verifica que la instalación funcionó abriendo una terminal y escribiendo:

dotnet --version
# Deberías ver algo como: 9.0.100

Instalar Visual Studio Code

Visual Studio Code es gratuito, ligero y funciona en todos los sistemas operativos. Es la opción más recomendada para empezar.

  1. Ve a code.visualstudio.com y descarga VS Code
  2. Instálalo y ábrelo
  3. Ve a la pestaña de Extensiones (icono de cuatro cuadrados en la barra lateral)
  4. Busca C# Dev Kit (extensión oficial de Microsoft) e instálala

Si prefieres un entorno más completo con todo integrado, puedes instalar Visual Studio Community (también gratuito, solo para Windows y macOS), que ya incluye soporte para C# sin necesidad de extensiones adicionales.

Crear tu primer proyecto

En C# moderno, los programas se organizan en proyectos. La forma más rápida de crear uno es desde la terminal con el comando dotnet new.

# Crear una carpeta para el proyecto y entrar en ella
mkdir mi-primer-programa
cd mi-primer-programa

# Crear un nuevo proyecto de consola en C#
dotnet new console

# Ejecutar el programa recién creado
dotnet run

Al ejecutar dotnet run por primera vez verás en la terminal:

Hello, World!

Ya tienes tu primer programa en C# funcionando. Ahora vamos a entender qué hay dentro.

El código que genera dotnet new

Abre el archivo Program.cs que se creó en tu carpeta. Su contenido es simplemente:

Console.WriteLine("Hello, World!");

Esto es lo que se llama la sintaxis de top-level statements, introducida en .NET 6. Es la forma más simple de escribir un programa en C#: no hace falta envolver todo en clases y métodos para empezar.

Sin embargo, para entender bien cómo funciona C# es importante ver la forma completa, que es lo que encontrarás en la mayoría del código real:

using System;

namespace MiPrimerPrograma
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
}

Vamos línea por línea:

  • using System;: importa el espacio de nombres System, que contiene herramientas básicas como Console. Es como decirle al programa "voy a usar cosas de esta librería".
  • namespace MiPrimerPrograma: agrupa el código bajo un nombre para organizarlo y evitar conflictos con otros programas.
  • class Program: en C#, todo el código vive dentro de clases. Program es el nombre convencional de la clase principal.
  • static void Main(string[] args): el punto de entrada del programa. Cuando ejecutas la aplicación, C# busca este método y empieza a ejecutar desde aquí. static significa que no necesita crear un objeto para llamarlo, void significa que no devuelve ningún valor, y string[] args son los argumentos que puedes pasarle desde la terminal.
  • Console.WriteLine(...): escribe una línea de texto en la consola.

Tu primer programa real: calculadora simple

Vamos a construir algo más interesante: un programa que pide dos números al usuario, los suma, y muestra el resultado.

// Program.cs

Console.WriteLine("=== Calculadora simple ===");
Console.WriteLine();

// Pedir el primer número
Console.Write("Introduce el primer número: ");
string entrada1 = Console.ReadLine();
double numero1 = double.Parse(entrada1);

// Pedir el segundo número
Console.Write("Introduce el segundo número: ");
string entrada2 = Console.ReadLine();
double numero2 = double.Parse(entrada2);

// Hacer el cálculo
double suma  = numero1 + numero2;
double resta = numero1 - numero2;
double producto  = numero1 * numero2;

// Mostrar los resultados
Console.WriteLine();
Console.WriteLine($"Suma:        {numero1} + {numero2} = {suma}");
Console.WriteLine($"Resta:       {numero1} - {numero2} = {resta}");
Console.WriteLine($"Producto:    {numero1} × {numero2} = {producto}");

// La división requiere comprobar que no dividimos entre cero
if (numero2 != 0)
{
    double cociente = numero1 / numero2;
    Console.WriteLine($"División:    {numero1} / {numero2} = {cociente}");
}
else
{
    Console.WriteLine("División:    no es posible dividir entre cero");
}

Ejecuta el programa con dotnet run y pruébalo con diferentes números.

Los conceptos fundamentales explicados

Variables y tipos de datos

C# es un lenguaje de tipado estático: cuando declaras una variable, especificas qué tipo de dato va a guardar y no puedes cambiar ese tipo.

// Tipos de datos más comunes en C#

// Números enteros
int edad = 25;
long poblacionMundo = 8_000_000_000L;   // el guión bajo mejora la legibilidad

// Números decimales
double precio = 19.99;
float temperatura = 36.6f;     // la f indica que es float (menos precisión que double)
decimal dinero = 1234.56m;     // el tipo correcto para dinero (más precisión)

// Texto
string nombre = "Ana García";
char inicial = 'A';            // un solo carácter, con comillas simples

// Verdadero o falso
bool activo = true;
bool mayorDeEdad = edad >= 18;   // se evalúa como true o false

// Inferencia de tipo con var: C# deduce el tipo automáticamente
var ciudad = "Madrid";         // inferido como string
var altura = 1.75;             // inferido como double
var contador = 0;              // inferido como int

Interpolación de strings

string nombre = "Carlos";
int edad = 30;
double salario = 2500.50;

// Interpolación con $"...": la forma más cómoda en C# moderno
Console.WriteLine($"Me llamo {nombre}, tengo {edad} años");
Console.WriteLine($"Mi salario es {salario:F2}€");   // F2 = dos decimales

// Concatenación tradicional (más verbosa)
Console.WriteLine("Me llamo " + nombre + ", tengo " + edad + " años");

// Formateo con placeholders
Console.WriteLine("Me llamo {0}, tengo {1} años", nombre, edad);

Entrada del usuario

// Console.ReadLine() devuelve siempre un string
// Hay que convertirlo al tipo que necesitas

Console.Write("¿Cuál es tu nombre? ");
string nombre = Console.ReadLine();

Console.Write("¿Cuántos años tienes? ");
string entradaEdad = Console.ReadLine();
int edad = int.Parse(entradaEdad);   // convertir string a int

// Forma más segura: TryParse no lanza excepción si el usuario escribe texto
Console.Write("Introduce un número: ");
string entrada = Console.ReadLine();
if (int.TryParse(entrada, out int numero))
{
    Console.WriteLine($"El doble de {numero} es {numero * 2}");
}
else
{
    Console.WriteLine("Eso no es un número válido");
}

Condicionales

int edad = 20;

// if / else if / else
if (edad < 18)
{
    Console.WriteLine("Eres menor de edad");
}
else if (edad >= 18 && edad < 65)
{
    Console.WriteLine("Eres adulto");
}
else
{
    Console.WriteLine("Eres mayor de 65");
}

// Operador ternario: condición ? valor_si_true : valor_si_false
string categoria = edad >= 18 ? "adulto" : "menor";
Console.WriteLine($"Categoría: {categoria}");

// switch: útil cuando comparas contra valores fijos
string diaSemana = "lunes";
switch (diaSemana)
{
    case "lunes":
    case "martes":
    case "miércoles":
    case "jueves":
    case "viernes":
        Console.WriteLine("Día laborable");
        break;
    case "sábado":
    case "domingo":
        Console.WriteLine("Fin de semana");
        break;
    default:
        Console.WriteLine("Día no reconocido");
        break;
}

// switch expression (C# moderno, más conciso)
string tipo = diaSemana switch
{
    "sábado" or "domingo" => "fin de semana",
    _                     => "día laborable"   // _ es el caso por defecto
};

Bucles

// for: cuando sabes cuántas veces quieres repetir
for (int i = 1; i <= 5; i++)
{
    Console.WriteLine($"Iteración {i}");
}

// while: mientras se cumpla la condición
int intentos = 0;
while (intentos < 3)
{
    Console.WriteLine($"Intento {intentos + 1}");
    intentos++;
}

// do-while: se ejecuta al menos una vez antes de comprobar la condición
string respuesta;
do
{
    Console.Write("¿Quieres continuar? (s/n): ");
    respuesta = Console.ReadLine().ToLower();
} while (respuesta != "s" && respuesta != "n");

// foreach: recorrer una colección
string[] frutas = { "manzana", "banana", "naranja", "kiwi" };
foreach (string fruta in frutas)
{
    Console.WriteLine(fruta);
}

Arrays y listas

// Array: tamaño fijo, se define al crear
int[] numeros = { 10, 20, 30, 40, 50 };
Console.WriteLine(numeros[0]);     // 10 (los índices empiezan en 0)
Console.WriteLine(numeros.Length); // 5

// Recorrer un array
for (int i = 0; i < numeros.Length; i++)
{
    Console.WriteLine($"numeros[{i}] = {numeros[i]}");
}

// List: tamaño dinámico, se puede añadir y quitar elementos
using System.Collections.Generic;

List nombres = new List();
nombres.Add("Ana");
nombres.Add("Carlos");
nombres.Add("María");

Console.WriteLine(nombres.Count);   // 3
Console.WriteLine(nombres[1]);      // Carlos

nombres.Remove("Carlos");
Console.WriteLine(nombres.Count);   // 2

// Inicializar con valores directamente
List edades = new List { 25, 30, 35, 40 };

// foreach funciona igual con listas
foreach (string nombre in nombres)
{
    Console.WriteLine(nombre);
}

Métodos

Los métodos son bloques de código reutilizables que puedes llamar desde cualquier parte del programa.

// Método que no devuelve nada (void) y no recibe argumentos
void MostrarBienvenida()
{
    Console.WriteLine("¡Bienvenido al programa!");
    Console.WriteLine("========================");
}

// Método que recibe parámetros y devuelve un valor
double Sumar(double a, double b)
{
    return a + b;
}

// Método con parámetro opcional (tiene valor por defecto)
void Saludar(string nombre, string saludo = "Hola")
{
    Console.WriteLine($"{saludo}, {nombre}!");
}

// Llamar a los métodos
MostrarBienvenida();

double resultado = Sumar(15.5, 4.5);
Console.WriteLine($"15.5 + 4.5 = {resultado}");

Saludar("Ana");              // Hola, Ana!
Saludar("Carlos", "Buenos días");  // Buenos días, Carlos!

Un programa completo: gestión de lista de tareas

Ahora que conoces los conceptos básicos, vamos a construir un pequeño programa de consola funcional: una lista de tareas con menú interactivo.

// Program.cs — Gestor de tareas simple

List tareas = new List();
bool continuar = true;

Console.WriteLine("=== Gestor de Tareas ===");

while (continuar)
{
    Console.WriteLine();
    Console.WriteLine("1. Ver todas las tareas");
    Console.WriteLine("2. Añadir tarea");
    Console.WriteLine("3. Eliminar tarea");
    Console.WriteLine("4. Salir");
    Console.Write("Elige una opción: ");

    string opcion = Console.ReadLine();

    switch (opcion)
    {
        case "1":
            MostrarTareas(tareas);
            break;

        case "2":
            Console.Write("Nueva tarea: ");
            string nuevaTarea = Console.ReadLine();
            if (!string.IsNullOrWhiteSpace(nuevaTarea))
            {
                tareas.Add(nuevaTarea.Trim());
                Console.WriteLine($"✓ Tarea '{nuevaTarea}' añadida");
            }
            else
            {
                Console.WriteLine("La tarea no puede estar vacía");
            }
            break;

        case "3":
            MostrarTareas(tareas);
            if (tareas.Count > 0)
            {
                Console.Write("Número de tarea a eliminar: ");
                if (int.TryParse(Console.ReadLine(), out int indice) &&
                    indice >= 1 && indice <= tareas.Count)
                {
                    string eliminada = tareas[indice - 1];
                    tareas.RemoveAt(indice - 1);
                    Console.WriteLine($"✓ Tarea '{eliminada}' eliminada");
                }
                else
                {
                    Console.WriteLine("Número no válido");
                }
            }
            break;

        case "4":
            continuar = false;
            Console.WriteLine("¡Hasta luego!");
            break;

        default:
            Console.WriteLine("Opción no reconocida. Elige entre 1 y 4.");
            break;
    }
}

// Método auxiliar para mostrar las tareas
void MostrarTareas(List lista)
{
    if (lista.Count == 0)
    {
        Console.WriteLine("No hay tareas pendientes");
        return;
    }

    Console.WriteLine($"\nTareas pendientes ({lista.Count}):");
    for (int i = 0; i < lista.Count; i++)
    {
        Console.WriteLine($"  {i + 1}. {lista[i]}");
    }
}

Guarda el código en Program.cs y ejecútalo con dotnet run. Tendrás un programa de consola completamente funcional con el que puedes añadir, ver y eliminar tareas.

Errores comunes al empezar

Olvidar el punto y coma. En C#, cada instrucción termina con ;. Si lo olvidas, el compilador te avisa con un error claro.

// ❌ Falta el punto y coma
Console.WriteLine("Hola")

// ✅ Correcto
Console.WriteLine("Hola");

Confundir mayúsculas y minúsculas. C# distingue entre mayúsculas y minúsculas. Console no es lo mismo que console.

// ❌ Error: 'console' no existe, debe ser 'Console'
console.WriteLine("Hola");

// ✅ Correcto
Console.WriteLine("Hola");

Intentar convertir texto no numérico a número. int.Parse() lanza una excepción si el texto no es un número válido. Usa int.TryParse() para entradas del usuario.

// ❌ Si el usuario escribe "hola", esto falla con una excepción
int numero = int.Parse(Console.ReadLine());

// ✅ TryParse maneja el error de forma controlada
if (int.TryParse(Console.ReadLine(), out int numero))
{
    Console.WriteLine($"El número es: {numero}");
}
else
{
    Console.WriteLine("Eso no es un número");
}

Olvidar que los índices empiezan en cero. El primer elemento de un array o lista está en la posición 0, no en la 1.

string[] nombres = { "Ana", "Carlos", "María" };
Console.WriteLine(nombres[0]);   // "Ana"    ← primer elemento
Console.WriteLine(nombres[1]);   // "Carlos" ← segundo elemento
Console.WriteLine(nombres[3]);   // ERROR: índice fuera de rango, solo existen 0, 1, 2

Los siguientes pasos

Con lo que has visto en esta guía puedes construir programas de consola funcionales. El siguiente escalón natural en C# es aprender la Programación Orientada a Objetos: clases, objetos, herencia y polimorfismo, que son los pilares sobre los que se construye prácticamente todo el código C# real.

Después, dependiendo de lo que quieras hacer, puedes explorar:

  • ASP.NET Core si te interesa el desarrollo web y APIs REST.
  • Unity si quieres desarrollar videojuegos, que usa C# como lenguaje principal.
  • MAUI si quieres crear aplicaciones de escritorio y móviles multiplataforma.
  • Entity Framework Core para trabajar con bases de datos desde C#.
Etiquetas: Principiantes

¿Te ha gustado esta entrada?

Compártela con tus compañeros para que también sigan aprendiendo.

Comunidad y Comentarios

0 COMENTARIOS

No hay comentarios todavía. Sé el primero en compartir tu opinión.

Escribe tu opinión
Respondiendo a