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

Windows Forms Discussion :

Utilisation d'une classe Singleton


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 77
    Points : 49
    Points
    49
    Par défaut Utilisation d'une classe Singleton
    Bonjour à tous,

    Dans le but de pouvoir contrôler les instances de mon formulaire, j'aimerais utiliser la classe Singleton pour l'unicité de mes formulaire à l'affichage. j'ai trouvé cette classe sur le net:

    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
     
     
    public sealed class Singleton
    {
        static readonly Singleton instance=new Singleton();
     
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Singleton()
        {
        }
     
        Singleton()
        {
        }
     
        public static Singleton Instance
        {
            get
            {
                return instance;
            }
        }
    }
    Mais je me demande si mes formulaires doivent hériter de cette classe ?
    Si quelqu'un peut me guider ou me donner un exemple ça m'aidera.

    Merci D'avance

  2. #2
    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,

    Tu ne peux pas hériter de cette classe car elle est marqué "sealed", de plus héritage et statique ne font pas bon ménage dans ce cas.
    Car le membre statique est censé représenter une référence partagé entre toutes les instances de ta classe et ceci inclus les instances des classes dérivées.

    De là tu as deux possibilités, copier/coller ceci dans tous tes formulaires, ou créer une sorte de singleton générique que tu pourra réutiliser à souhait.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Peut-être regarder du coté du pattern Factory
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 77
    Points : 49
    Points
    49
    Par défaut
    Antoine.debyser pour le modèle générique as tu un exemple ? Pour le pattern Factory je vais faire des recherches pour voir .
    Merci

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par sadem Voir le message
    Mais je me demande si mes formulaires doivent hériter de cette classe ?
    Non, c'est un "modèle" à suivre pour les singletons. Il faut que tu crées ta propre classe selon le même modèle (remplace "Singleton" par le nom de ta classe, et ajoute les membres que tu veux)

    Citation Envoyé par BenoitM Voir le message
    Peut-être regarder du coté du pattern Factory
    Bah je vois pas trop le rapport avec la question... Il demande comment faire un Singleton, pas une Factory

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 77
    Points : 49
    Points
    49
    Par défaut
    D'accord je vais essayer de ce pas .Merci

  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
    Un exemple qui plaiera peut etre pas à tous le monde mais il marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        public sealed class Singleton<T> where T : new()
        {
            private static readonly T _instance = new T();
     
            public static T Instance
            {
                get { return _instance; }
            }
        }
    Et après si tu as une classe "Toto" que tu veux utiliser en tant que singleton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Singleton<Toto>.Instance.MethodeTataDeLaClassToto()

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par antoine.debyser Voir le message
    Un exemple qui plaiera peut etre pas à tous le monde mais il marche
    Ouais, mais ça pose un problème : tu es obligé d'avoir un constructeur public, ce qui est un peu contre nature pour un singleton...

    Il y a un truc comme ça dans la lib Dvp.NET, mais ça utilise Activator.CreateInstance pour créer l'instance de l'objet à l'aide du constructeur privé. On pourrait croire que c'est plus lent, mais en fait la contrainte new() utilise aussi Activator.CreateInstance, donc a priori ça change rien. Par contre, l'inconvénient est que ça ne fonctionne que pour du code qui s'exécute en Full Trust (mais c'est généralement le cas pour une appli Windows Forms)

  9. #9
    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
    tu es obligé d'avoir un constructeur public, ce qui est un peu contre nature pour un singleton..
    C'est effectivement pour ça que je dis que ça peut ne pas plaire.
    Mais en même temps je me suis toujours dit que j'avais pas le choix, si je voulais pas me taper du copier/coller.
    C'est plus un débat philosophique qu'autre chose, est-ce aux développeurs qui vont utiliser cette classe de faire attention à ne pas appeler le constructeur, ou est-ce à moi de verrouiller l'appel au constructeur?

    Il y a un truc comme ça dans la lib Dvp.NET, mais ça utilise Activator.CreateInstance pour créer l'instance de l'objet à l'aide du constructeur privé. On pourrait croire que c'est plus lent, mais en fait la contrainte new() utilise aussi Activator.CreateInstance, donc a priori ça change rien
    Du coup j'ai un peu regarder ce qui se passe coté C# désassemblé et IL.
    Et là c'est assez marrant, la contraintre ne semble pas se traduire (je n'arrive pas à la retrouver dans l'IL), et l'initialisation du champs se fait en deux parties
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public class Singleton<T> where T : new()
    	{
    		private static readonly T _instance = (default(T) == null) ? Activator.CreateInstance<T>() : default(T);
    		public static T Instance
    		{
    			get
    			{
    				return Singleton<T>._instance;
    			}
    		}
    	}
    Ce qui m'a d'ailleur appris une chose "default(T)" doit visiblement retourner null si le constructeur par défaut est privé.

    Mais je suis pas sur que "Activator.CreateInstance<T>()" soit aussi rapide que "default(T)", en revanche dans notre cas on s'en tape un poil que ca soit rapide ou non la premier fois.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par antoine.debyser Voir le message
    est-ce aux développeurs qui vont utiliser cette classe de faire attention à ne pas appeler le constructeur, ou est-ce à moi de verrouiller l'appel au constructeur?
    En principe une classe singleton ne peut pas être instanciée depuis l'extérieur de la classe, sinon il n'y a aucune garantie qu'on ne créera pas une autre instance. Bon, évidemment, après on peut toujours tricher en créant une instance par réflexion ou avec Activator.CreateInstance

    Citation Envoyé par antoine.debyser Voir le message
    Et là c'est assez marrant, la contraintre ne semble pas se traduire (je n'arrive pas à la retrouver dans l'IL)
    Bah justement, y a pas d'équivalent IL, c'est bien pour ça qu'il utilise Activator.CreateInstance...

    Citation Envoyé par Jon Skeet
    As far as I'm aware, there's no IL to give support for the new() constraint. Instead, the compiler emits a call to Activator.CreateInstance<T>.
    Citation Envoyé par antoine.debyser Voir le message
    Ce qui m'a d'ailleur appris une chose "default(T)" doit visiblement retourner null si le constructeur par défaut est privé.
    Euh, je vois pas le rapport en fait
    Le test sur default(T) sert à vérifier si T est un type référence (auquel cas ça renvoie null) ou un type valeur (dans ce cas ça renvoie une instance de la structure avec tous les champs initialisés à leur valeur par défaut). Activator.CreateInstance n'est donc utilisé que si T est un type référence, vu que pour un type valeur il est plus simple et plus rapide de faire simplement default(T)


    Citation Envoyé par antoine.debyser Voir le message
    Mais je suis pas sur que "Activator.CreateInstance<T>()" soit aussi rapide que "default(T)", en revanche dans notre cas on s'en tape un poil que ca soit rapide ou non la premier fois.
    Ah bah c'est sûr que c'est beaucoup plus lent... mais vu que pour un type référence, default(T) renvoie null, ça nous aide pas beaucoup.

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 77
    Points : 49
    Points
    49
    Par défaut
    Ça marche mais une fois mon formulaire fermé il n'est plus possible de l'ouvrir.Ca me ramène cette erreur:
    Cannot access a disposed object.
    Object name: 'RolesList'.
    Dois je testé si le formulaire a été déchargé avant l'affichage ?

    Merci

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Une fois fermé, un formulaire ne peut plus être affiché... il faut le recréer. Donc en fait c'est pas une très bonne idée d'utiliser un singleton pour ça, sauf si c'est des forms que tu fermes jamais (éventuellement tu peux les cacher au lieu de les fermer)

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 77
    Points : 49
    Points
    49
    Par défaut
    Merci Tomlev c'est ce que je me suis dit aussi.Je vais essayer une autre solution je vous tiens informé.Ce sont des formulaires que je veux afficher dans un TabControl (Par Onglets).

  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
    Citation Envoyé par tomlev Voir le message
    Euh, je vois pas le rapport en fait
    Le test sur default(T) sert à vérifier si T est un type référence (auquel cas ça renvoie null) ou un type valeur (dans ce cas ça renvoie une instance de la structure avec tous les champs initialisés à leur valeur par défaut). Activator.CreateInstance n'est donc utilisé que si T est un type référence, vu que pour un type valeur il est plus simple et plus rapide de faire simplement default(T)
    Euh oui, fatigué moi

  15. #15
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 77
    Points : 49
    Points
    49
    Par défaut
    Le but que je recherche est de pouvoir afficher mes formulaires dans des onglets.Une fois, le formulaire déjà ouvert lorsqu'on clique,il doit être activé automatiquement et avoir le focus.Si c'est le cas contraire,le formulaire est créé et affiché.

    Merci

Discussions similaires

  1. Réponses: 14
    Dernier message: 02/02/2006, 18h32
  2. Réponses: 4
    Dernier message: 08/11/2005, 15h10
  3. ou mettre une structure utilisée par une classe
    Par grand's dans le forum C++
    Réponses: 10
    Dernier message: 28/07/2005, 18h53
  4. Réponses: 8
    Dernier message: 22/12/2004, 22h57
  5. Réponses: 2
    Dernier message: 18/05/2004, 14h12

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