Risposte:
In C#
non è possibile definire vere variabili globali (nel senso che non appartengono a nessuna classe).
Detto questo, l'approccio più semplice che conosco per imitare questa caratteristica consiste nell'usare a static class
, come segue:
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
}
È quindi possibile recuperare i valori definiti ovunque nel codice (a condizione che faccia parte dello stesso namespace
):
String code = Globals.CODE_PREFIX + value.ToString();
Per gestire diversi spazi dei nomi, puoi:
Globals
classe senza includerla in una specifica namespace
(in modo che venga inserita nello spazio dei nomi dell'applicazione globale);namespace
.Non esiste una variabile globale in C #. Periodo.
Puoi avere membri statici se vuoi:
public static class MyStaticValues
{
public static bool MyStaticBool {get;set;}
}
static
esempio che hai fornito non può essere considerato una variabile globale.
Per prima cosa esamina se hai davvero bisogno di una variabile globale invece di usarla sfacciatamente senza considerare la tua architettura software.
Supponiamo che superi il test. A seconda dell'utilizzo, i Globals possono essere difficili da eseguire il debug con le condizioni di gara e molte altre "cose cattive", è meglio affrontarli da un'angolazione in cui sei pronto a gestire cose così brutte. Così,
static
classe (per la gestibilità).Lo schema di base per una tale classe sarebbe:
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.
}
Utilizzo da altre classi (all'interno dello stesso spazio dei nomi)
// Read
bool areWeAlive = Globals.Expired;
// Write
// past deadline
Globals.Expired = true;
Una caratteristica utile per questo è using static
Come altri hanno già detto, devi creare una classe per i tuoi globali:
public static class Globals {
public const float PI = 3.14;
}
Ma puoi importarlo in questo modo per non scrivere più il nome della classe davanti alle sue proprietà statiche:
using static Globals;
[...]
Console.WriteLine("Pi is " + PI);