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.
- Ve a dotnet.microsoft.com/download
- Descarga la versión más reciente del SDK (no el Runtime, sino el SDK completo)
- 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.
- Ve a code.visualstudio.com y descarga VS Code
- Instálalo y ábrelo
- Ve a la pestaña de Extensiones (icono de cuatro cuadrados en la barra lateral)
- 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 nombresSystem, que contiene herramientas básicas comoConsole. 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.Programes 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í.staticsignifica que no necesita crear un objeto para llamarlo,voidsignifica que no devuelve ningún valor, ystring[] argsson 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#.
No hay comentarios todavía. Sé el primero en compartir tu opinión.