Réponses:
Dans C#
vous ne pouvez pas définir de vraies variables globales (dans le sens où elles n'appartiennent à aucune classe).
Cela étant dit, l'approche la plus simple que je connaisse pour imiter cette fonctionnalité consiste à utiliser a static class
, comme suit:
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
}
Vous pouvez ensuite récupérer les valeurs définies n'importe où dans votre code (à condition que cela fasse partie du même namespace
):
String code = Globals.CODE_PREFIX + value.ToString();
Afin de gérer différents espaces de noms, vous pouvez soit:
Globals
classe sans l'inclure dans un spécifique namespace
(afin qu'elle soit placée dans l'espace de noms global de l'application);namespace
.Il n'y a pas de variable globale en C #. Période.
Vous pouvez avoir des membres statiques si vous le souhaitez:
public static class MyStaticValues
{
public static bool MyStaticBool {get;set;}
}
static
exemple que vous avez fourni ne peut pas vraiment être considéré comme une variable globale.
Commencez par examiner si vous avez vraiment besoin d'une variable globale à la place, en l'utilisant de manière flagrante sans tenir compte de votre architecture logicielle.
Supposons qu'il passe le test. En fonction de l'utilisation, Globals peut être difficile à déboguer avec les conditions de concurrence et beaucoup d'autres "mauvaises choses", il est préférable de les aborder sous un angle où vous êtes prêt à gérer de telles mauvaises choses. Alors,
static
classe (pour plus de facilité de gestion).Le plan de base pour une telle classe serait:
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.
}
Utilisation à partir d'autres classes (dans le même espace de noms)
// Read
bool areWeAlive = Globals.Expired;
// Write
// past deadline
Globals.Expired = true;
Une fonctionnalité utile pour cela est using static
Comme d'autres l'ont dit, vous devez créer une classe pour vos globaux:
public static class Globals {
public const float PI = 3.14;
}
Mais vous pouvez l'importer comme ceci afin de ne plus écrire le nom de la classe devant ses propriétés statiques:
using static Globals;
[...]
Console.WriteLine("Pi is " + PI);