Variables Globales C #

¿Cómo declaro, en C #, una variable para que cada clase (* .cs) pueda acceder a su contenido, sin una referencia de instancia?

En C# no puede definir verdaderas variables globales (en el sentido de que no pertenecen a ninguna clase).

Dicho esto, el enfoque más simple que conozco para imitar esta característica consiste en utilizar una static class , de la siguiente manera:

 public static class Globals { public const Int32 BUFFER_SIZE = 512; // Unmodifiable public static String FILE_NAME = "Output.txt"; // Modifiable public static readonly String CODE_PREFIX = "US-"; // Unmodifiable } 

A continuación, puede recuperar los valores definidos en cualquier parte de su código (siempre que sea parte del mismo namespace ):

 String code = Globals.CODE_PREFIX + value.ToString(); 

Para tratar con diferentes espacios de nombres, puede:

  • declare la clase Globals sin incluirla en un namespace específico (para que se ubique en el espacio de nombres de la aplicación global);
  • inserte la directiva de uso apropiado para recuperar las variables de otro namespace .

No existe una variable global en C #. Período.

Puede tener miembros estáticos si lo desea:

 public static class MyStaticValues { public static bool MyStaticBool {get;set;} } 

Primero examine si realmente necesita una variable global en lugar de usarla descaradamente sin considerar su architecture de software.

Supongamos que pasa la prueba. Dependiendo del uso, Globals puede ser difícil de depurar con condiciones de carrera y muchas otras “cosas malas”, es mejor acercarse a ellos desde un ángulo en el que estés preparado para manejar cosas tan malas. Asi que,

  1. Envuelva todas esas variables globales en una única clase static (para facilidad de administración).
  2. Tener propiedades en lugar de campos (= ‘variables’). De esta manera, tiene algunos mecanismos para abordar cualquier problema con las escrituras simultáneas en Globals en el futuro.

El bosquejo básico para tal clase sería:

 public class Globals { private static bool _expired; public static bool Expired { get { // Reads are usually simple return _expired; } set { // You can add logic here for race conditions, // or other measurements _expired = value; } } // Perhaps extend this to have Read-Modify-Write static methods // for data integrity during concurrency? Situational. } 

Uso de otras clases (dentro del mismo espacio de nombres)

 // Read bool areWeAlive = Globals.Expired; // Write // past deadline Globals.Expired = true;