Ejercicio: Los bloques de código y el ámbito de las variables

Completado

Un bloque de código es una o varias instrucciones de C# que definen una ruta de acceso de ejecución. Las instrucciones fuera del bloque de código influyen en cómo, en qué casos y con qué frecuencia se ejecuta ese bloque de código en tiempo de ejecución. Los límites de un bloque de código normalmente se definen mediante corchetes, {}.

Además de su efecto en la ruta de acceso de ejecución, los bloques de código también pueden afectar al ámbito de las variables. Los ejemplos de código que examine durante este ejercicio le ayudarán a comprender la relación entre los bloques de código y el ámbito de variable.

Los bloques de código afectan al ámbito de las declaraciones de variable

El ámbito de variable hace referencia a la visibilidad de una variable para el código restante de la aplicación. Una variable de ámbito local solo es accesible dentro del bloque de código en el que está definida. Si intenta acceder a la variable fuera del bloque de código, recibirá un error del compilador.

El resto de esta unidad explora la relación entre los bloques de código y el ámbito de variable.

Preparación del entorno de creación de código

Este módulo incluye actividades prácticas que le guían por el proceso de compilación y ejecución de código de demostración. Se recomienda realizar estas actividades con Visual Studio Code como entorno de desarrollo. El uso de Visual Studio Code para estas actividades le ayudará a familiarizarse con la escritura y la ejecución de código en un entorno de desarrollador que usan los profesionales de todo el mundo.

  1. Abra Visual Studio Code.

    Puede usar el menú Inicio de Windows (o un recurso equivalente para otro sistema operativo) para abrir Visual Studio Code.

  2. En Visual Studio Code, en el menú Archivo, seleccione Abrir archivo.

  3. En el cuadro de diálogo Abrir carpeta, vaya a la carpeta Escritorio de Windows.

    Si tiene una ubicación de carpeta diferente donde guarda los proyectos de código, úsela. Para este curso, lo importante es tener una ubicación fácil de encontrar y recordar.

  4. En el cuadro de diálogo Abrir carpeta, elija Seleccionar carpeta.

    Si ve un cuadro de diálogo de seguridad en el que se le pregunta si confía en los autores, seleccione .

  5. En Visual Studio Code, en el menú Terminal, seleccione Nuevo terminal.

    Observe que un símbolo del sistema en el panel Terminal muestra la ruta de acceso de la carpeta actual. Por ejemplo:

    C:\Users\someuser\Desktop>
    

    Nota

    Si está trabajando en su propio equipo, en lugar de en un entorno aislado u hospedado, y ha realizado otros módulos de Microsoft Learn de esta serie de C#, es posible que ya haya creado una carpeta de proyecto para ejemplos de código. Si ese es el caso, puede saltar al paso siguiente, que se usa para crear una aplicación de consola en la carpeta TestProject.

  6. En el símbolo del sistema del terminal, para crear una nueva aplicación de consola en una carpeta especificada, escriba dotnet new console -o ./CsharpProjects/TestProject y presione Entrar.

    Este comando de la CLI de .NET usa una plantilla de programa de .NET para crear un nuevo proyecto de aplicación de consola de C# en la ubicación de carpeta especificada. El comando crea las carpetas CsharpProjects y TestProject y usa TestProject como nombre del archivo .csproj.

  7. En el panel EXPLORADOR, expanda la carpeta CsharpProjects.

    Debería ver la carpeta TestProject y dos archivos, un archivo de programa de C# llamado Program.cs y un archivo de proyecto de C# llamado TestProject.csproj.

  8. En el panel EXPLORADOR, para ver el archivo de código en el panel Editor, seleccione Program.cs.

  9. Elimine las líneas de código existentes.

    Usará este proyecto de consola de C# para crear, compilar y ejecutar ejemplos de código durante este módulo.

  10. Cierre el panel del terminal.

Creación de una variable dentro de un bloque de código

Para comenzar, examinará el caso en el que se inicializa una variable dentro de un bloque de código.

  1. Asegúrese de que ha abierto Visual Studio Code y de que Program.cs se muestre en el panel del editor.

    Nota

    Program.cs debe estar vacío. Si no es así, seleccione y elimine todas las líneas de código.

  2. En el Editor de Visual Studio Code, escriba el código siguiente:

    bool flag = true;
    if (flag)
    {
        int value = 10;
        Console.WriteLine($"Inside the code block: {value}");
    }
    
  3. En el menú Archivo Visual Studio Code, seleccione Guardar.

    El archivo Program.cs debe guardarse antes de compilar o ejecutar el código.

  4. En el panel EXPLORADOR, para abrir un terminal en la ubicación de la carpeta TestProject, haga clic con el botón derecho en TestProject y seleccione abrir en terminal integrado.

    Se abrirá un panel del terminal. El terminal debe incluir un símbolo del sistema que muestre que dicho terminal está abierto en la ubicación de la carpeta TestProject.

  5. En el símbolo del sistema del terminal, para ejecutar el código, escriba dotnet run y presione Intro.

    Nota

    Si ve un mensaje que indica "No se ha podido encontrar un proyecto para ejecutar", asegúrese de que el símbolo del sistema del terminal muestra la ubicación prevista de la carpeta TestProject. Por ejemplo: C:\Users\someuser\Desktop\csharpprojects\TestProject>

    Debería ver la siguiente salida:

    Inside the code block: 10
    

Este es el resultado esperado. Pero ¿qué ocurre si queremos acceder a la variable value fuera del bloque de código de la instrucción if?

Intentar acceder a una variable fuera del bloque de código en el que se declara

  1. En el editor de Visual Studio Code, cree una nueva línea de código debajo del bloque de código de la instrucción if.

  2. En la línea de código en blanco que creó, agregue la siguiente línea de código:

    Console.WriteLine($"Outside the code block: {value}");
    
  3. Compruebe que el código actualizado tiene el siguiente aspecto:

    bool flag = true;
    if (flag)
    {
        int value = 10;
        Console.WriteLine($"Inside the code block: {value}");
    }
    Console.WriteLine($"Outside the code block: {value}");
    
  4. Guarde el archivo de código y use Visual Studio Code para ejecutar el código.

    Escriba dotnet run desde el símbolo del sistema de terminal para ejecutar el código.

  5. Tenga en cuenta que al intentar ejecutar la aplicación, obtendrá un error de compilación:

    Program.cs(7,46): error CS0103: The name 'value' does not exist in the current context
    

La parte Program.cs(7,46) del mensaje indica que el error está asociado a la línea 7 del archivo Program.cs, columna 46.

Este error se genera porque una variable declarada dentro de un bloque de código solo es accesible (solo se puede ver) dentro de ese bloque de código. Dado que no se puede tener acceso a una variable fuera del bloque de código en el que se declara, no se puede tener acceso a value desde la línea 7 del código.

Una variable declarada en un bloque de código de método se conoce como una variable local. Es posible que vea el término variable local que se usa al revisar artículos que describen el ámbito de las variables.

Mover la declaración de variable por encima del bloque de código

Para acceder a una variable tanto dentro como fuera de un bloque de código, deberá declarar la variable antes (encima) del bloque de código para que el código fuera del bloque de código pueda "ver" la variable.

  1. Actualice el código en el editor de Visual Studio Code de la siguiente manera:

    bool flag = true;
    int value;
    
    if (flag)
    {
        Console.WriteLine($"Inside the code block: {value}");
    }
    
    value = 10;
    Console.WriteLine($"Outside the code block: {value}");
    
  2. Dedique un minuto a revisar el código actualizado.

  3. Observe que value ahora se declara (pero no se inicializa) fuera del bloque de código if.

  4. Use Visual Studio Code para guardar las actualizaciones y, a continuación, ejecute el código.

  5. Observe que sigue recibiendo un error de compilación.

    Esta vez, cuando intente ejecutar la aplicación, obtendrá un error de compilación:

    Program.cs(6,49): error CS0165: Use of unassigned local variable 'value'
    

    El error está asociado a la línea 6 dentro del bloque de código porque value no está inicializado (no se le ha asignado un valor). Si la línea de código value = 10; se encontraba encima del bloque de código de instrucción if, la aplicación se compilaría correctamente y todo sería correcto. Sin embargo, dado que no se ha inicializado value, no se puede acceder a él dentro del bloque de código.

    Este problema se soluciona asegurándose de que las variables se inicializan antes de intentar acceder a ellas.

Inicializar una variable como parte de la declaración de variable

  1. Para inicializar value como parte de la declaración de variable, actualice el código de la siguiente manera:

    bool flag = true;
    int value = 0;
    
    if (flag)
    {
        Console.WriteLine($"Inside the code block: {value}");
    }
    
    value = 10;
    Console.WriteLine($"Outside the code block: {value}");
    

    Este código aborda el error de compilación "variable local sin asignar" inicializando value como parte de la declaración de variable.

  2. Use Visual Studio Code para compilar y ejecutar el código.

  3. Ahora, al ejecutar la aplicación, debería ver la siguiente salida:

    Inside the code block: 0
    Outside the code block: 10
    

Examinar la interpretación del compilador del código

Para evitar errores de runtime, el compilador de C# analiza el código en el editor de Visual Studio Code y durante el proceso de compilación. Sin embargo, es posible que el compilador no siempre interprete el código de la misma manera que usted.

Considere los siguientes dos ejemplos de código que parecen tener el mismo propósito:

// Code sample 1
bool flag = true;
int value;

if (flag)
{
    value = 10;
    Console.WriteLine($"Inside the code block: {value}");
}

Console.WriteLine($"Outside the code block: {value}");
// Code sample 2
int value;

if (true)
{
    value = 10;
    Console.WriteLine($"Inside the code block: {value}");
}

Console.WriteLine($"Outside the code block: {value}");

Es posible que estos dos ejemplos siempre generen el mismo resultado, pero el compilador de C# interpreta estos dos ejemplos de código de forma diferente.

Para el primer ejemplo de código, el compilador interpreta flag como una variable booleana a la que se podría asignar un valor de true o false. El compilador concluye que si flag es false, value no se inicializará cuando se ejecute el segundo Console.WriteLine(). Básicamente, el compilador considera posibles las dos rutas de acceso de ejecución de código siguientes:

// path when flag = true
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");

AND

// path when flag = false
int value;
Console.WriteLine($"Outside the code block: {value}");

Dado que el compilador considera la segunda ruta de acceso una posibilidad (para el ejemplo de código 1), genera un mensaje de error durante el proceso de compilación. Además, el editor de código de Visual Studio Code le advierte de este problema mostrando una línea ondulada roja bajo value (debajo del bloque de código).

Para el segundo ejemplo de código, el cumplidor concluye que el contenido del bloque de código de instrucción if siempre se ejecutará (true siempre es true). El compilador no genera un error de compilación porque interpreta el segundo ejemplo de código para tener una única ruta de acceso de ejecución de la siguiente manera:

int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");

Resumen

Estos son algunos aspectos importantes que hay que recordar sobre los bloques de código:

  • Al declarar una variable dentro de un bloque de código, su visibilidad es local para ese bloque de código y no se puede tener acceso a esa variable fuera del bloque de código.
  • Para asegurarse de que una variable está visible tanto dentro como fuera de un bloque de código, debe declarar la variable antes del bloque de código (fuera y encima del bloque de código).
  • Asegúrese de que las variables se inicializan antes de que el código intente acceder a ellas (para todas las posibles rutas de acceso de ejecución de código).

Comprobación de conocimientos

1.

Un desarrollador escribe código que incluye un bloque de código de la instrucción if. Inicializan una variable de entero en un valor de 5 por encima (fuera) del bloque de código. Inicializan una segunda variable de entero en un valor de 6 en la primera línea dentro del bloque de código. La expresión booleana del bloque de código de bloque se evalúa como true si la primera variable de entero tiene un valor superior a 0. En la segunda línea del bloque de código, asignan la suma de los dos valores a la primera variable. En la primera línea después del bloque de código, escriben código para mostrar el valor del primer entero. ¿Cuál es el resultado cuando se ejecuta la instrucción de código utilizada para mostrar el primer entero?