web-dev-qa-db-fra.com

Comment utiliser les variables globales en C #?

Comment déclarer une variable pour que chaque classe (* .cs) puisse accéder à son contenu, sans référence d'instance?

86
Mas Ajum

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:

  • déclarer la classe Globals sans l'inclure dans un namespace spécifique (afin qu'elle soit placée dans l'espace de nom global de l'application);
  • insère la directive using appropriée pour extraire les variables d'un autre namespace.
102
Tommaso Belluzzo

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;}
}
68

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,

  1. Enveloppez toutes ces variables globales dans une seule classe static (pour la facilité de gestion).
  2. Avoir des propriétés au lieu de champs (= 'variables'). De cette façon, vous disposez de mécanismes pour résoudre tout problème d’écriture simultanée dans Globals.

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;
21
DeepSpace101

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);
_
1
Zotta