Explication 'static' [Résolu]

Signaler
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Statut
Membre
Dernière intervention
27 novembre 2015
-
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Statut
Membre
Dernière intervention
27 novembre 2015
-
Bonjour,
Je me suis inspiré d'un exemple donné sur ce site pour utiliser des variables globales. Jusqu'à maintenant je me passais de ce type de variables. Mais dans le cas présent, je dois aller chercher des données (chaine de connexion) dans un ficheir XML et donc pour des questions de temps de réponse, je ne veux charger qu'une seule fois ce fichier...
Voici ce que j'ai fait
    public sealed class Globals
    {
        internal  static String connectionStringAAA = Caso.GetConnectionString("aaa");
        internal static String connectionStringBBB = Caso.GetConnectionString("bbb");
    }


Pour l'utilisation, je fais
String AAA = Globals.connectionStringAAA
(exemple)

j'utilise mes globales dans plusieurs classe de mon projet et je me suis aperçu que les méthodes
Caso.GetConnectionString("...");
n'étaient appelées qu'une seul fois (point d'arrêt).

Ma question : Est-ce parce que mes variables globales sont de type "static" qu'à l'utilisation de mes Globals ne sont chargées qu'une seule fois ?

Slts

DT

4 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Salut

Oui, c'est le principe des variables "static". Mais je ne comprends pas vraiment ce que tu veux : d'un côté tu souhaites ne charger le fichier qu'une seule fois et d'un autre tu te plains que ta méthode ne soit appelé qu'une fois...

Pour être précis au niveau des variables statiques, elles sont initialisées au moment où on y accède la première fois (si je me souviens bien). Puis elles gardent leur valeur jusqu'à ce que tu la change toi-même.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Statut
Membre
Dernière intervention
27 novembre 2015

Non, je ne me plains pas qu'elle soit appelée qu'une seule fois (au contraire). C'est plutot un constatation "positive". c'est ce que je recherchais à faire.

Ta remarque qur l'init des static confirme le fonctionnement
Merci


DT
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Ah, ok, dans ce cas, c'est parfait.

Tu peux également utiliser le design pattern "singleton", qui correspond à un objet accessible depuis n'importe quelle classe, mais dont il n'existe qu'une instance.

Un truc du genre

public class MonSingleton
{
    private MonSingleton() {} // Ctor private pour éviter d'instancier la classe
    
    private static MonSingleton _instance = null; // Instance unique de la classe
    public static Instance
    {
        get
        {
            if(_instance null) _instance new MonSingleton();
            return _instance;
        }
    }

    /*
    * Et là toutes tes méthodes / variables / propriétés (mais sans le mot-clé static)
    */
}


Puis quand tu voudras accéder à ton objet, tu auras juste à faire
MonSingleton.Instance.MaMethode();


Tu auras l'avantage d'avoir ton constructeur, de pouvoir faire jouer l'héritage, et de manipuler un objet plutôt qu'une classe.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Statut
Membre
Dernière intervention
27 novembre 2015

Merci pour la précision sur le singleton. Je vais garder la première solution dans ce contexte, mais ta précision m'a permis de comprendre le fonctionnement/rôle d'un singleton (que je devrai sans aucun doute utiliser un jour)



DT