Ejercicio: Los bloques de código y el ámbito de las variables
- 11 minutos
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 resto del código de su 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 programación
Este módulo incluye actividades prácticas que le guiarán en 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 desarrollo que usan profesionales de todo el mundo.
Abra Visual Studio Code.
Puede usar el menú Inicio de Windows (o un recurso equivalente en otro sistema operativo) para abrir Visual Studio Code.
En el menú Archivo de Visual Studio Code, seleccione Abrir carpeta.
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 ejercicio, lo importante es tener una ubicación fácil de encontrar y recordar.
En el cuadro de diálogo Abrir carpeta , seleccione Seleccionar carpeta.
Si ve un cuadro de diálogo de seguridad que pregunta si confía en los autores, seleccione Sí.
En el menú Terminal de Visual Studio Code, seleccione Nuevo terminal.
Observe que el símbolo del sistema del 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 este es el caso, puede omitir el siguiente paso, que es para crear una aplicación de consola en la carpeta TestProject.
En la terminal, para crear una nueva aplicación de consola en una carpeta especificada, escriba el siguiente comando:
dotnet new console -o ./CsharpProjects/TestProjectEste 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.Si se muestra un mensaje que indica que los archivos ya existen, continúe con los pasos siguientes. Reutilizará los archivos de proyecto existentes.
En la vista EXPLORER, expanda la carpeta CsharpProjects .
Debería ver la carpeta TestProject y dos archivos, un archivo de programa de C# denominado Program.cs y un archivo de proyecto de C# denominado TestProject.csproj.
En el menú Archivo de Visual Studio Code, seleccione Abrir carpeta.
En el cuadro de diálogo Abrir carpeta , seleccione la carpeta CsharpProjects y, a continuación, seleccione Seleccionar carpeta.
En la vista EXPLORER, expanda la carpeta TestProject y, a continuación, seleccione Program.cs.
Elimine las líneas de código que contiene.
Usará este proyecto de consola de C# para crear, compilar y ejecutar ejemplos de código durante este módulo.
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.
Asegúrese de que ha abierto Visual Studio Code y de que Program.cs se muestra en el panel Editor.
Nota
Program.cs debe estar vacío. Si no es así, seleccione y elimine todas las líneas de código.
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}"); }En el menú Archivo de Visual Studio Code, seleccione Guardar.
El archivo Program.cs debe guardarse antes de compilar o ejecutar el código.
En el panel EXPLORER, para abrir un terminal en la ubicación de la carpeta TestProject, haga clic con el botón derecho en TestProject y, a continuación, 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.
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 de carpeta TestProject prevista. Por ejemplo:
C:\Users\someuser\Desktop\csharpprojects\TestProject>Debería ver el siguiente resultado:
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
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.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}");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}");Guarde el archivo de código y use Visual Studio Code para ejecutar el código.
Escriba
dotnet rundesde el símbolo del sistema de terminal para ejecutar el código.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.
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}");Dedique un minuto a revisar el código actualizado.
Observe que
valueahora se declara (pero no se inicializa) fuera del bloque de códigoif.Use Visual Studio Code para guardar las actualizaciones y, a continuación, ejecute el código.
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
valueno está inicializado (no se le ha asignado un valor). Si la línea de códigovalue = 10;se encontraba encima del bloque de código de instrucciónif, la aplicación se compilaría correctamente y todo sería correcto. Sin embargo, dado que no se ha inicializadovalue, 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
Para inicializar
valuecomo 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
valuecomo parte de la declaración de variable.Use Visual Studio Code para compilar y ejecutar el código.
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 ayudar a 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}");
Y
// 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).