Programación funcional en C#: guía práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Programación funcional en C#: un enfoque moderno para el desarrollo



La programación funcional (PF) es un paradigma en el que los cálculos se tratan como la evaluación de funciones matemáticas y se evita el cambio de estado y los datos mutables. Aunque C# fue creado originalmente como un lenguaje orientado a objetos, a partir de la versión 3.0 ha ido incorporando activamente elementos del enfoque funcional. Hoy en día, la programación funcional en C# no es solo una tendencia de moda, sino una herramienta poderosa para escribir código más predecible, comprobable y seguro para la concurrencia.



En este artículo, analizaremos los conceptos clave de la PF aplicados a C#: funciones puras, inmutabilidad de datos, LINQ, cierres y expresiones lambda. Verá cómo estas técnicas ayudan a escribir código conciso y confiable en el ecosistema .NET.



1. Funciones puras y ausencia de efectos secundarios



Una función pura es una función que:

  • Siempre devuelve el mismo resultado para los mismos argumentos (transparencia referencial).
  • No tiene efectos secundarios (no modifica variables globales, no realiza entrada/salida, no cambia los argumentos pasados).


En C#, una función pura podría verse así:



// Función purapublic int AddPure(int a, int b){    return a + b;}

// Función NO pura (efecto secundario — salida a consola y modificación de variable global)private int _state = 0;public int AddImpure(int a, int b){ _state++; Console.WriteLine("Llamada a función"); return a + b + _state;}


Las ventajas de las funciones puras son obvias: son fáciles de probar, predecibles y se pueden llamar de forma segura desde hilos paralelos. Intente extraer toda la lógica no relacionada con E/S en funciones puras.



2. Inmutabilidad de datos (Immutability)



La programación funcional fomenta el trabajo con datos inmutables. En lugar de modificar un objeto existente, se crea un nuevo objeto con las propiedades modificadas. En C#, para esto son ideales:

  • record (desde C# 9) — tipo de referencia con igualdad basada en valores e inmutabilidad por defecto.
  • struct — para estructuras inmutables pequeñas (por ejemplo, coordenadas, dinero).
  • IEnumerable<T> — para colecciones inmutables a través de LINQ.


Ejemplo con record:



public record Person(string Name, int Age);

// Uso de la expresión with para crear una copia con cambiosvar original = new Person("Alexey", 30);var updated = original with { Age = 31 };

Console.WriteLine(original); // Person { Name = Alexey, Age = 30 }Console.WriteLine(updated); // Person { Name = Alexey, Age = 31 }


Este enfoque elimina la modificación accidental de datos en un lugar que afecta a otras partes del programa.



3. LINQ — consultas funcionales a datos



LINQ (Language Integrated Query) es, quizás, el ejemplo más brillante del enfoque funcional en C#. Permite procesar colecciones de forma declarativa, utilizando cadenas de métodos.



Métodos funcionales clave de LINQ:

  • Select — transformación de cada elemento (análogo a map).
  • Where — filtrado (análogo a filter).
  • Aggregate — plegado (análogo a reduce).
  • SelectMany — aplanamiento de colecciones anidadas (flatMap).


Ejemplo: encontrar la suma de los cuadrados de los números pares.



int[] numbers = { 1, 2, 3, 4, 5, 6 };

// Estilo imperativoint sumImperative = 0;foreach (var num in numbers){ if (num % 2 == 0) { sumImperative += num * num; }}

// Estilo funcional con LINQint sumFunctional = numbers .Where(n => n % 2 == 0) // filtrado .Select(n => n * n) // transformación .Sum(); // agregación

C

Blogs

Book Recommendations