Bloques de código anidados y ámbito de variables

Ya tratamos este tema en clases anteriores, pero reforzaremos los conceptos analizando cómo funciona el almacenamiento en memoria.

Este tutorial pertenece a foxdevelop.com. Por favor indica la fuente si lo compartes.

Dentro del cuerpo de un método se pueden anidar otros bloques de código.

class Program
{
    static void Main()
    {
        int age = 19;
        {
            int one = 23;
        }
    }
}
Lenguaje del código: C# (cs)

No hay límite de bloques de código. Se pueden colocar en secuencia o anidarse en varios niveles sin restricciones de profundidad.

class Program
{
    static void Main()
    {
        int age = 19;
        {
            int one = 23;
            {
                int two = 45;
                {
                    int three = 56;
                }
            }
        }
    }
}Lenguaje del código: C# (cs)

Ten en cuenta que sentencias como int xxxx = xxx; situadas encima de un bloque anidado son sentencias paralelas a dicho bloque.

Por ejemplo, int age = 19; y el bloque anidado que aparece después son dos sentencias independientes. No confundas esta estructura con el cuerpo completo de un método.


Ciclo de vida

Veamos un ejemplo

    static void Main()
    {
        int a = 10;
        {
            int b = 20;
        }
    }Lenguaje del código: C# (cs)

En este ejemplo existen dos variables locales. La variable externa a pertenece al ámbito principal de la función Main, mientras que b pertenece al bloque anidado interno.

Seguiremos la ejecución paso a paso para observar cómo se gestiona la memoria de pila.

Paso 1: Solo se ejecuta int a = 10;. Se reserva espacio en la pila para a con valor 10;

Paso 2: Entramos al bloque interno y ejecutamos int b = 20;. Se añade b a la pila. El orden de arriba hacia abajo es: b, a;

Paso 3: El bloque interno finaliza su ejecución. b se elimina de la pila y solo queda a.

Paso 4: El método Main termina. a también se retira de la pila, todas las variables del programa se destruyen y la ejecución finaliza.

Resumen

Las variables declaradas dentro de un bloque anidado inician su ciclo de vida en la línea de declaración y terminan cuando finaliza el bloque que las contiene.

Cuando un bloque anidado termina de ejecutarse, todas sus variables locales se eliminan y destruyen desde la pila.

El cuerpo de un método es, en realidad, un gran bloque de código.


Ámbito (Scope)

Mientras el ámbito de una variable siga activo, no se puede declarar otra variable local con el mismo nombre, sin importar cuántos niveles de anidamiento existan.

Observa el siguiente ejemplo

    static void Main()
    {
        int a = 10;
        {
            int a = 20;
        }
    }Lenguaje del código: C# (cs)

En este fragmento, la variable a del bloque interno tiene el mismo nombre que la variable a externa. Esto genera un error y la compilación falla.

Motivo: El ámbito de int a = 10; abarca todas las llaves que lo rodean. Dentro de ese ámbito no se permiten nombres repetidos. Aunque int a = 20; esté en un bloque anidado, dicho bloque forma parte del cuerpo del método donde ya existe a. El compilador detecta el conflicto y marca la línea con una línea ondulada roja.

Esta norma se mantiene incluso si cambias el tipo de dato de la segunda variable a.

Dentro de un mismo ámbito los nombres de variables deben ser únicos, independientemente de su tipo de dato.

En la imagen, el ámbito de la variable externa a aparece en amarillo y el de la interna en verde. Se aprecia claramente que el ámbito exterior engloba al interior, generando el conflicto.

La solución es cambiar el nombre de la variable a interior.

Veamos otro ejemplo

¿Habrá conflicto si escribimos el código así?

class Program
{
    static void Main()
    {
        int a = 10;

        {
            double b = 20;
        }

        {
            double b = 30;
        }

    }
}Lenguaje del código: C# (cs)

La respuesta es no. Aunque existen dos variables llamadas b, sus ámbitos no se solapan, por lo que la compilación funciona correctamente. La primera b solo existe en su propio bloque y la segunda pertenece a otro bloque independiente. Consulta la imagen.

Las zonas coloreadas marcan el ámbito de cada variable b. Espero que ahora quede claro para todos los lectores.

Bloques de código anidados y ámbito de variables

Deja una respuesta

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