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 :

[1.1] Quelle est la différence entre Dispose() et Close() ?


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 108
    Points : 48
    Points
    48
    Par défaut [1.1] Quelle est la différence entre Dispose() et Close() ?
    Bonjour.

    QQn sait qu'elle est la différence entre Dipose() et Close() et dans quels cas utiliser l'un et pas l'autre ?

    Merci.

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Close te permet de fermer une fenêtre mis en la laissant en mémoire. Tu pourras alors rappeller ta_fenetre.Show().

    Dispose libère les ressources associées à ta fenêtre donc là, tu ne pourras pas faire ton .Show.

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 108
    Points : 48
    Points
    48
    Par défaut
    Je te remercie Morpheus.

    Dans ce cas, selon toi, il vaut mieux faire un close et ainsi pouvoir faire un show plus loin ou bien faire un dispose et libérer les ressources mais devoir faire un New avant de faire le show ?

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Il a toujours été affirmé que pour améliorer les performances des applications .NET, il faut faire appel à Dispose lorsque celui-ci est disponible

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 108
    Points : 48
    Points
    48
    Par défaut
    Cool parfait!

    Merci encore pour ta réponse et ta rapidité...

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par Morpheus
    Close te permet de fermer une fenêtre mis en la laissant en mémoire. Tu pourras alors rappeller ta_fenetre.Show().
    Non. Tu devais penser à Hide() en disant cela car c'est Hide qui cache la fenêtre.

    Close ferme ta fenêtre et librère la mémoire.
    Close appelle Dispose en interne (si mes souvenirs sont exacts)
    Tout comme Dispose.
    Pour une Form, les deux font la même chose.

    si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FormX f = new FormX();
    f.Close(); // ou f.Dispose();
    f.Show(); // Tu auras une belle ObjectDisposedException
    Tu auras un beau carton

  7. #7
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    A une nuance près pour la fermeture:
    http://blog.developpez.com/index.php...&c=1&tb=1&pb=1

    quoi je fais de le pub pour mon blog?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    De manière générale, quand il y a une méthode Close et une méthode Dispose, il est quasiment garanti que Dispose appelle Close (ça devrait toujours être le cas, vu que Dispose est là pour tout boucler et faire le ménage, ce qui inclut de fermer tout ce qui est fermable :). Par contre, il n'y a aucune garantie sur ce que fait Close.

    Le principe de base est toujours le même : s'il y a une méthode Dispose, on l'appelle. À partir du moment où ce principe est respecté, il y a des Close dont on peut se passer, quoique ça ne coûte pas plus cher de les appeler quand même (on n'est pas à une ligne près :)

    Dispose a plutôt sa place dans un bloc Try/Finally (ou plus simplement avec using et en convertissant les VBeux aux C# :), tandis que Close peut très bien se contenter d'être dans le flux normal du programme. Si le bloc environnant est garanti de passer par Dispose au final, les ressources sont toujours libérées, c'est sûr. Avec Close seul, même dans un Try/Finally, c'est pas forcément vrai.

  9. #9
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Après les petits tests que je viens de finir je dirais même:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    object.Close
    object.Dispose
    object = Nothing 'ou = null; si tu préfère maniak :)
    la collection se fesant plus rapidement encore... je testerais ca correctement demain car il y a aussi un débat sur = null

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Piotrek
    je testerais ca correctement demain car il y a aussi un débat sur = null :)
    Pas vraiment un débat, juste une histoire de références.

    Le garbage collector ne vire que les variables qui ne sont plus référencées. Donc si une classe a un champ qui contient pas mal de ressources (managées ou non, ça sort du cadre de Dispose là), appeler Dispose dessus est bien, ça dégage les ressources non-managées, mais les ressources managées ne seront nettoyées que quand l'instance de la classe elle-même ne sera plus référencée.

    Re-donc, si un champ privé contient pas mal de données mais n'est utilisé que pendant une partie de la vie de l'objet qui le contient, le mettre à null permet au GC de passer (éventuellement) dessus quand il en aura l'occasion.

    Dans le cas des variables locales ça ne sert à rien vu qu'elles ne sont plus référencées dès qu'on sort du bloc.

    Après, on peut souligner que si une classe contient un champ privé qui ne sert que pendant une partie de sa vie, ça indique peut-être le besoin de créer une nouvelle classe :)

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Je ne suis pas un expert, je veux juste partager mes remarques d'apres mon experience

    Hide() permet de cacher la fenetre comme il est dit plus haut

    Dispose() libere les ressources liées à la fenetre qui l'appelle.

    Close() libere toutes les ressources qu'elles soient liées aux fenetres filles qu'aux fentres parent.

  12. #12
    Membre habitué Avatar de lasrevinu
    Inscrit en
    Février 2010
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 215
    Points : 134
    Points
    134
    Par défaut
    petite correction
    C'est Close qui appele dispose,

  13. #13
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    J'arrive après la bataille, mais je me souviens d'une de mes premières régies. Le client disait :
    Là où tu fais "monObjet.Open()" tu fais plus loin un Close() et pour tout Object monObjet = New Object() tu fais un Dispose() (s'il est disposable ;-p)...

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

Discussions similaires

  1. Quelle est la différence entre bool et BOOL
    Par irnbru dans le forum MFC
    Réponses: 2
    Dernier message: 03/11/2005, 15h35
  2. Réponses: 2
    Dernier message: 25/05/2005, 21h34
  3. Réponses: 5
    Dernier message: 03/05/2005, 18h22
  4. Réponses: 11
    Dernier message: 31/01/2005, 17h48
  5. Quelle est la différence entre le float et le real ?
    Par Manson dans le forum Débuter
    Réponses: 3
    Dernier message: 10/08/2004, 17h26

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