Explication 'static'

Résolu
babe59 Messages postés 189 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 27 novembre 2015 - 30 nov. 2009 à 12:35
babe59 Messages postés 189 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 27 novembre 2015 - 30 nov. 2009 à 14:40
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

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
30 nov. 2009 à 13:42
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é ! -
3
babe59 Messages postés 189 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 27 novembre 2015
30 nov. 2009 à 13:51
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
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
30 nov. 2009 à 14:06
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é ! -
0
babe59 Messages postés 189 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 27 novembre 2015
30 nov. 2009 à 14:40
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
0
Rejoignez-nous