Funciones locales

En inglés se denominan Local Functions, una característica incorporada a partir de C# 7.0.

Anteriormente estudiamos la invocación de métodos. Dentro del bloque de código de un método se pueden llamar otros métodos, bajo estas reglas:

  • Métodos dentro de la misma clase: se invocan directamente indicando el nombre y pasando los parámetros;
  • Métodos de otra clase: primero hay que crear una instancia de la clase correspondiente y el método destino debe llevar el modificador public.

A partir de C# 7.0, se pueden definir funciones independientes dentro de un método, a estas se les llamafunciones locales:

  1. Aislamiento: solo se pueden invocar desde el método externo que las contiene, el código exterior no tiene acceso;
  2. Ventajas: agrupan la lógica del código, mejoran la legibilidad y simplifican el mantenimiento;
  3. Normas de declaración: a diferencia de las variables locales, las funciones locales se pueden declarar en cualquier punto del método externo sin necesidad de declararlas previamente.

Las funciones locales pueden capturar variables locales del método exterior, aunque su ámbito de actuación queda limitado al método contenedor.


Primero repasemos un concepto básico:

Las variables locales dentro de una función se ejecutan en orden descendente. Es obligatorio declarar la variable antes de usarla, no se puede hacer al revés.

Tomemos este código como ejemplo: la variable hour se crea más abajo, por lo que no se puede acceder a ella antes de su definición.

    int GetHours()
    {
        Console.WriteLine(hour);
        int hour = DateTime.Now.Hour;
        return hour;
    }Lenguaje del código: C# (cs)

Aunque el ámbito de hour cubre todo el cuerpo del método, no está permitido usarla antes de crearla.

Aparecerá un error con una línea ondulada roja, el aviso de error es el que se ve en la imagen superior.

Esto es distinto con los métodos. Un método definido más abajo puede ser llamado desde uno superior. Los métodos de clase son miembros de la clase y se registran en la Method Table (tabla de métodos). Al invocarlos se consulta esta tabla, no se sigue una ejecución secuencial de arriba hacia abajo.

En el siguiente ejemplo, el método Main superior llama a GetHours definido posteriormente. El comportamiento difiere de las reglas de declaración y uso de variables locales.

class Program
{
    static void Main()
    {
        Program program = new Program();
        program.GetHours();
    }

    int GetHours()
    {
        int hour = DateTime.Now.Hour;
        return hour;
    }
}Lenguaje del código: C# (cs)

Volvamos a las funciones locales.

Veamos el ejemplo:



class Program
{
    static void Main()
    {
        Program program = new Program();
        program.ZoomIn();
    }

    public void ZoomIn()
    {
        // Se puede llamar a la función local antes de declararla
        int results0 = ZoomIn5(10);
        Console.WriteLine($"A: {results0}");

        // Función local: multiplica el valor recibido val por 5 y devuelve el resultado
        int ZoomIn5(int val)
        {
            return val * 5;
        }

        // Invocación de la función local
        int results = ZoomIn5(10);
        Console.WriteLine($"B: {results}");

        int results2 = ZoomIn5(5);
        Console.WriteLine($"C: {results2}");
    }
}
Lenguaje del código: C# (cs)

El ámbito de una función local está limitado al método que la contiene. Se puede acceder a ella tanto antes como después de su declaración dentro de ese método.

Además, el nombre de una función local puede coincidir con el del método que la alberga.



class Program
{
    static void Main()
    {
        Program program = new Program();
        program.ZoomIn5();
    }

    public void ZoomIn5()
    {
        // Se puede llamar a la función local antes de declararla
        int results0 = ZoomIn5(10);
        Console.WriteLine($"A: {results0}");

        // Función local: multiplica el valor recibido val por 5 y devuelve el resultado
        int ZoomIn5(int val)
        {
            return val * 5;
        }

        // Invocación de la función local
        int results = ZoomIn5(10);
        Console.WriteLine($"B: {results}");

        int results2 = ZoomIn5(5);
        Console.WriteLine($"C: {results2}");
    }
}
Lenguaje del código: C# (cs)

En el código superior, tanto el método externo como la función local se llaman ZoomIn5. No hay conflicto porque sus ámbitos son diferentes, aunque no se recomienda escribir código de esta forma.

Funciones locales

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *