C# es un lenguaje de programación desarrollado por Microsoft. Es un lenguaje de alto nivel, orientado a objetos y de propósito general.
Se utiliza en el desarrollo de aplicaciones de escritorio, web y móviles, principalmente, en el ecosistema de Microsoft.
Estructura básica
Hola Mundo en C#
El clásico ejemplo para imprimir “Hola Mundo” en consola.
using System;
class Program {
    static void Main(string[] args) {
        Console.WriteLine("Hola Mundo");
    }
}Estructura de un programa
Los programas en C# tienen una estructura modular. Todo el código debe estar dentro de una clase. El punto de entrada de la ejecución es el método Main.
Comentarios
C# admite comentarios de una línea y multilínea.
// Esto es un comentario de una línea
/* Esto es un
   comentario multilínea */Variables y Tipos de Datos
Declaración de variables
int numero = 10;
string texto = "Hola";
double decimal = 4.5;
bool esVerdad = true;Tipos de datos comunes
| Tipo | Tamaño | Descripción | 
|---|---|---|
| int | 32 bits | Enteros | 
| double | 64 bits | Decimales de doble precisión | 
| float | 32 bits | Decimales de precisión simple | 
| char | 16 bits | Carácter Unicode | 
| string | - | Cadena de texto | 
| bool | 1 bit | Valor booleano | 
Variables constantes
Las variables cuyo valor no cambia se definen con const.
const double PI = 3.1416;Estructuras de control
Condicionales
Condicional if-else
int a = 5;
if (a > 10) {
    Console.WriteLine("Mayor que 10");
} else if (a == 10) {
    Console.WriteLine("Igual a 10");
} else {
    Console.WriteLine("Menor que 10");
}Condicional switch
int dia = 3;
switch (dia) {
    case 1:
        Console.WriteLine("Lunes");
        break;
    case 2:
        Console.WriteLine("Martes");
        break;
    default:
        Console.WriteLine("Otro día");
        break;
}Bucles
Bucle for
for (int i = 0; i < 5; i++) {
    Console.WriteLine(i);
}Bucle while
int i = 0;
while (i < 5) {
    Console.WriteLine(i);
    i++;
}Bucle do-while
int i = 0;
do {
    Console.WriteLine(i);
    i++;
} while (i < 5);Funciones y Métodos
Declaración de funciones
int Sumar(int a, int b) {
    return a + b;
}Llamar una función
int resultado = Sumar(5, 3);
Console.WriteLine(resultado);  // Imprime 8Funciones con sobrecarga
int Multiplicar(int a, int b) {
    return a * b;
}
double Multiplicar(double a, double b) {
    return a * b;
}Parámetros Opcionales
void Saludar(string nombre, string saludo = "Hola")
{
    Console.WriteLine($"{saludo}, {nombre}!");
}
Saludar("Luis"); // Hola, Luis!
Saludar("María", "Bonjour"); // Bonjour, María!Programación Orientada a Objetos (POO)
Definición de una clase
class Persona {
    public string Nombre;
    public int Edad;
    public void Saludar() {
        Console.WriteLine($"Hola, soy {Nombre}");
    }
}Crear un objeto
Persona persona1 = new Persona();
persona1.Nombre = "Luis";
persona1.Saludar();  // Imprime "Hola, soy Luis"Propiedades
class Producto
{
    private string _nombre;
    public string Nombre
    {
        get { return _nombre; }
        set { _nombre = value; }
    }
}Definir un constructor
class Persona {
    public string Nombre;
    public int Edad;
    public Persona(string nombre, int edad) {
        Nombre = nombre;
        Edad = edad;
    }
}Crear un objeto con constructor
Persona persona2 = new Persona("Ana", 25);
Console.WriteLine(persona2.Nombre);  // Imprime "Ana"Definición de interfaz
interface IVehiculo {
    void Arrancar();
}
class Coche : IVehiculo {
    public void Arrancar() {
        Console.WriteLine("El coche arranca");
    }
}Definir clase genérica
class Caja<T> {
 public T Contenido { get; set; }
}
Caja<int> cajaInt = new Caja<int> { Contenido = 5 };
Console.WriteLine(cajaInt.Contenido);  // Imprime 5Herencia
Herencia entre clases
class Animal {
    public void Comer() {
        Console.WriteLine("Estoy comiendo");
    }
}
class Perro : Animal {
    public void Ladrar() {
        Console.WriteLine("Guau Guau");
    }
}Crear una instancia de clase derivada
Perro perro = new Perro();
perro.Comer();  // Imprime "Estoy comiendo"
perro.Ladrar(); // Imprime "Guau Guau"Polimorfismo
Métodos virtuales y override
class Animal {
    public virtual void HacerSonido() {
        Console.WriteLine("Sonido genérico");
    }
}
class Perro : Animal {
    public override void HacerSonido() {
        Console.WriteLine("Guau");
    }
}Colecciones y arrays
Declarar un array
int[] numeros = {1, 2, 3, 4, 5};Acceder a elementos del array
Console.WriteLine(numeros[0]);  // Imprime 1Listas genéricas
List<int> lista = new List<int>();
lista.Add(10);
lista.Add(20);
Console.WriteLine(lista.Count);  // Imprime 2Recorrer una lista
foreach (int numero in lista) {
    Console.WriteLine(numero);
}Manejo de Excepciones
Try-Catch para manejo de errores
try {
    int resultado = 10 / 0;
} catch (DivideByZeroException ex) {
    Console.WriteLine("Error: División por cero");
} finally {
    Console.WriteLine("Bloque finally ejecutado");
}Delegados y Eventos
Declaración de un delegado
delegate void Operacion(int x, int y);
class Programa {
    static void Sumar(int a, int b) {
        Console.WriteLine(a + b);
    }
    static void Main(string[] args) {
        Operacion operacion = Sumar;
        operacion(5, 3);  // Imprime 8
    }
}Definición y uso de un evento
class EventoEjemplo {
    public delegate void DelegadoEvento();
    public event DelegadoEvento Evento;
    public void DispararEvento() {
        if (Evento != null) {
            Evento();
        }
    }
}
class Programa {
    static void Main(string[] args) {
        EventoEjemplo ej = new EventoEjemplo();
        ej.Evento += () => Console.WriteLine("Evento Disparado");
        ej.DispararEvento();  // Imprime "Evento Disparado"
    }
}LINQ (Consultas integradas en el lenguaje)
Consulta básica con LINQ
int[] numeros = {1, 2, 3, 4, 5};
var resultado = numeros.Where(n => n > 2).ToList();
foreach (var n in resultado) {
    Console.WriteLine(n);  // Imprime 3, 4, 5
}Archivos y Entrada/Salida
Escribir en un archivo
using System.IO;
File.WriteAllText("archivo.txt", "Contenido del archivo");Leer de un archivo
string contenido = File.ReadAllText("archivo.txt");
Console.WriteLine(contenido);Asincronía y Tareas
Declaración de método async y uso de await
async Task<int> LlamarApiAsync() {
    await Task.Delay(1000);  // Simula una operación asincrónica
    return 42;
}Uso de await
async Task Main() {
    int resultado = await LlamarApiAsync();
    Console.WriteLine(resultado);  // Imprime 42
}Espacios de nombres
Usar using para incluir namespaces
using System;  // Incluye el espacio de nombres System
Console.WriteLine("Hola Mundo");Métodos de Extensión
Definir un método de extensión
public static class Extensiones {
    public static int Duplicar(this int numero) {
        return numero * 2;
    }
}
int numero = 10;
Console.WriteLine(numero.Duplicar());  // Imprime 20