IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Créer une instance unique en C#


Sujet :

C#

  1. #1
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 30
    Points : 15
    Points
    15
    Par défaut Créer une instance unique en C#
    Bonjour à tous,

    Je voudrais savoir s'il est possible de créer une instance unique en C# afin d'agir toujours sur la même classe. Voici un exemple qui sera plus parlant qu'un long discours :p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    /* 
      J'ai deux classes : classe_a et classe_b
      Dans la classe_a j'ai deux boutons : bouton_envoi et bouton_ok
      Dans la classe_b j'ai un label intitulé : label_recu
      Nous sommes ici dans la classe_a :
    */
     
    namespace projet_1
    {
        public partial class classe_a : Form
        {
            bouton_envoi.Click(object sender, EventArgs e)
            {
                 //Je mets à jour le label de la classe_b
                 //Pour faire cela il faut que j'instancie la classe_b
                 classe_b classe_b = new classe_b();
                 classe_b.label_recu.Text = "C'est envoyé !";
            }
     
             bouton_ok.Click(object sender, EventArgs e)
            {
                 //Je mets à jour le label de la classe_b
                 //Pour faire cela il faut également que j'instancie la classe_b
                 classe_b classe_b = new classe_b();
                 classe_b.label_recu.Text = "C'est OK !";
            }
        }
    }

    Le problème de cette méthode est que je ne travaille jamais sur la même instance, si je clique sur le bouton envoi alors je créer un objet de la classe b ou le label contiendra "C'est envoyé !" et si je clique sur le bouton ok je créer un autre objet de la classe b qui contiendra "C'est Ok !". Or ce que je souhaite c'est travailler sur la même instance d'où l'envie de créer une instance unique, savez-vous comment faire?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Bonjour,
    Il existe un patron de conception : le singleton
    http://jlambert.developpez.com/tutor...gleton-csharp/

  3. #3
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Cela a l'air très utile mais il existe beaucoup de méthodes lol, il faut que je m'y plonge sérieusement. Dans mon cas quelle méthode utiliseriez vous?

    Cordialement.

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Au vu de ton exemple je n'utiliserai pas un singleton. J'utiliserai un attribut.
    Sinon pour les singletons il y a une implémentation généric dans la librairie dvp

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par antoine.debyser Voir le message
    Bonjour,

    Au vu de ton exemple je n'utiliserai pas un singleton. J'utiliserai un attribut.
    Sinon pour les singletons il y a une implémentation généric dans la librairie dvp
    Il est a noter que depuis .Net 4, il existe la classe Lazy<T> qui permet de faire un singleton à instanciation différée qui est ThreadSafe

  6. #6
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Je travaille sur PDA et je suis en compact framework 3.5... Je devrais donc utiliser des singleton non?

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Non, ca depend du but rechercher.
    A vu de ton exemple, un simple attribut suffit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    namespace projet_1
    {
        public partial class classe_a : Form
        {
               classe_b b = new classe_b();
        }
    }
    J'ajouterai que comme classe_b semble un objet ihm, du devrait même le mettre sur ta classe_a par le designer intégrer dans visual.

  8. #8
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Le but sera d'agir sur ma même classe_b depuis la classe_a et la classe_c, soit je passe toutes mes classes en statiques ou soit j'utilise un singleton non?

    Cordialement.

  9. #9
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Une form ne peut pas être statique car c'est une instance.

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par adrianolimit Voir le message
    Le but sera d'agir sur ma même classe_b depuis la classe_a et la classe_c, soit je passe toutes mes classes en statiques ou soit j'utilise un singleton non?

    Cordialement.
    Et bien il suffit de partager l'instance de b entre a et c.
    Ok le singleton permet de faire ce partage, mais est-il nécessaire?

  11. #11
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Pour partager l'instance de la classe_b entre la classe_a et la classe_c comment puis-je faire sans singleton?

    Cordialement

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    En passant une instance de b au constructeur de a et c, par exemple.
    Ou en utilisant un setter sur les instances de a et c. C'est plus moche mais dans le cadre du designer winform, c'est obligatoire.

  13. #13
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Pouvez-vous me montrer un exemple s'il vous plaît?

    Cordialement

  14. #14
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    namespace projet_1
    {
        public partial class classe_a
        {
               classe_b _b;
               public classe_a(class_b b)
               {
                   _b = b;
               }
        }
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    namespace projet_1
    {
        public partial class classe_a : Form
        {
               classe_b _b;
     
               public classe_b MonB
               {
                   get { return _b; }
                   set { _b = value; }
               }
        }
    }
    Et a l'utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    classe_b b1 = new classe_b();
    classe_a a1 = new classe_a(b1);
    classe_c c1 = new classe_c();
    c1.MonB = b1;

  15. #15
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Cela ne fonctionne pas quand je teste, j'ai de multiples erreurs notamment des type de méthodes attendues car n'indique pas de types (void , string...).

  16. #16
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Je pense qu'il serait intéressant pour toi de prendre et lire un tutoriel sur les bases de C# et notamment les chapitres concernant les constructeurs.

  17. #17
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    J'ai lu des chapitres sur les constructeurs qui comprenaient des notions que je connaissaient déjà par contre les singleton sont très utiles et sont ce que je recherchais, merci de vos différentes aides.

    Cordialement.

  18. #18
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 106
    Points : 14
    Points
    14
    Par défaut
    Pourquoi vous compliquer les choses au Monsieur !! la solution est assez simple.
    Dans ta classe, tu cree un attribut static boolean dejaInstancier=false; alors au moment de l'instantiation tu test si l'attribut :

    if (! dejaInstancier ) .... instantiation...
    else autre chose ...

  19. #19
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par marocdivers Voir le message
    Pourquoi vous compliquer les choses au Monsieur !! la solution est assez simple.
    Dans ta classe, tu cree un attribut static boolean dejaInstancier=false; alors au moment de l'instantiation tu test si l'attribut :

    if (! dejaInstancier ) .... instantiation...
    else autre chose ...
    euh? Parce qu'une réponse comme tu viens de le faire ne vaut pas un clou! Si une attribut n'est pas instanciée alors il vaudra null. Pas besoin d'un booléen pour ca. D'autant plus que ca ne garantie rien sur la concurrence d'accès et l'unicité.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/03/2007, 21h14
  2. Réponses: 5
    Dernier message: 17/07/2006, 18h34
  3. Réponses: 1
    Dernier message: 20/06/2006, 15h11
  4. [Débutant] Créer une instance avec le nom d'une classe
    Par Quetzalcoatl dans le forum Langage
    Réponses: 7
    Dernier message: 23/01/2006, 20h43
  5. [VB.NET]Créer une instance par page
    Par Dnx dans le forum ASP.NET
    Réponses: 20
    Dernier message: 31/10/2005, 13h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo