Saltar al contenido

Entendiendo el alcance y la visibilidad en C#

Este concepto define la parte de la aplicación en la que la variable es accesible, denominada alcance de una variable. Las variables pueden definirse en clases, métodos, bucles y estructuras.

Hay tres alcances principales para una variable:

Entendiendo el alcance y la visibilidad en C#
Entendiendo el alcance y la visibilidad en C#
  1. Nivel de clase
  2. Nivel del método
  3. Nivel de bloqueo (Alcance anidado)

Nivel de clase

Vamos a crear un código para demostrarlo.

12345678910111213141516171819202122 usando el Sistema;namespace {publicclassClassLevel{int a =6;string b ="This is a string";voidex(){double c =10.0; Consola. WriteLine($"El valor c es {c}");}publicstaticvoidMain(){ClassLevel a =newClassLevel(); Console.WriteLine($"El valor a es {a.a}"); Console.WriteLine($"El valor b es {a.b}"); ClassLevel.ex(); Console.ReadKey();}}

csharp

La salida es la siguiente.

123El valor a es 6El valor b es Esta es una cadenaEl valor c es 10

bash

Cuando declaramos una variable en una clase fuera de cualquier método, se puede acceder a ella en cualquier lugar de la clase, como en nuestro caso anterior con las dos variables a y b. Cuando se definen las variables de esta manera, se llaman campos o miembros de la clase . Las variables de nivel de clase, como la c en nuestro caso, sólo pueden ser accedidas por el método no estático de la clase en la que fueron definidas. Si definimos un modificador de acceso a una variable de nivel de clase, no afecta a su alcance dentro de la clase. Los modificadores de acceso proporcionan acceso a los campos desde fuera de la clase.

Nivel del método

Vamos a crear un ejemplo para demostrarlo.

1234567891011121314151617181920212223242526 usando System;namespace {publicclassMethodLevel{double c;voidfirst(){double c =10.0; Console.WriteLine($"El valor c es {c}");} evita el segundo(){Console. WriteLine($"El valor c es {c}");}publicstaticvoidMain(){MethodLevel a =newMethodLevel(); Console.WriteLine($"El valor c es {a.c}"); a.first(); a.second(); Console.ReadKey();}}}

csharp

El resultado es el siguiente.

123El valor c es 0El valor c es 10El valor c es 0

bash

Esto demuestra cómo los métodos encapsulan su propio espacio de nombres y las variables definidas en él. Podemos ver cómo las impresiones para el valor de c son diferentes en este caso. Siempre que definimos una variable dentro de un método, se le asigna el ámbito del nivel del método y no podemos acceder a ella fuera de este método. Esta variable no puede sobrescribirse o ser sobrescrita por una variable del mismo nombre de un ámbito superior. Estas variables se denominan variables locales . No podemos declararlas dos veces con el mismo nombre en el mismo ámbito. Después de ejecutar el método, las variables dejan de existir, ya que son recolectadas por el siempre ávido recolector de basura.

Nivel de bloqueo

También vamos a demostrar esto con un ejemplo.

12345678910111213141516171819usando el Sistema;namespace {publicclassBlockLevel{publicstaticvoidMain(){double roentgen =3.6;if(roentgen >=3.6){mensaje de cuerda ="¡No es genial, no es terrible!";}else{mensaje de cuerda ="¡Bueno, podría ser peor!";} Console.WriteLine($"Informe de estado: {message"); Console.ReadKey();}}}

csharp

El código anterior no compilará ni ejecutará. El problema es indicado por el compilador en dos etapas. El primer mensaje que obtenemos es que el valor de la variable del mensaje fue declarado pero nunca utilizado, y el segundo mensaje que obtenemos es que la variable del mensaje no existe en el contexto actual.

Podemos evitarlo modificando el mensaje para que no sea una cadena declarada en el if, sino que lo lleve al ámbito de la función Main() o lo convierta en un campo de clase.

Estas variables son típicamente útiles cuando se declaran dentro de un bucle de “para” o “mientras”. A veces se denominan variables de bucle debido a su alcance limitado. Cuando se declara una variable fuera de un bucle, sigue siendo accesible dentro de los bucles anidados, lo que significa que una variable de nivel de clase será accesible para los métodos y los bucles también. El nivel del método será accesible al método y al bucle. La variable declarada dentro del cuerpo de un bucle no será accesible desde los alcances superiores.