Comment déclarer une variable pour que chaque classe (* .cs) puisse accéder à son contenu, sans référence d'instance?
Dans C#
, vous ne pouvez pas définir de vraies variables globales (dans le sens où elles n'appartiennent à aucune classe).
Ceci étant dit, l'approche la plus simple que je connaisse pour imiter cette fonctionnalité consiste à utiliser un 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
sans l'inclure dans un namespace
spécifique (afin qu'elle soit placée dans l'espace de nom global de l'application);namespace
.Il n’existe pas de variable globale en C #. Période.
Vous pouvez avoir des membres statiques si vous voulez:
public static class MyStaticValues
{
public static bool MyStaticBool {get;set;}
}
Commencez par examiner si vous avez vraiment besoin d’une variable globale, au lieu de l’utiliser de manière flagrante sans tenir compte de votre architecture logicielle.
Supposons qu'il passe le test. En fonction de l'utilisation, il peut être difficile de résoudre les problèmes de Globals dans des conditions de course et de nombreuses 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
(pour la 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 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 déjà dit, vous devez créer une classe pour vos globals:
_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);
_