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 :

[C#] destruction d'un objet


Sujet :

Windows Forms

  1. #1
    Membre régulier Avatar de legillou
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 178
    Points : 93
    Points
    93
    Par défaut [C#] destruction d'un objet
    Bonjour à tous

    J'ai créé un objet en C# qui m'ouvre un port COM

    quand dans mon appli je clique sur le bouton "deconnecter" j'aimerais bien détruire cet objet.

    Deux questions me viennent donc a l'esprit :
    1 : Comment faire ?
    2 : Est ce que le fait de le détruire va bien me fermer la connection ou faut-il que je passe par une methode intermédiaire qui me ferme la connection ??

    Merci d'avance !!

    Gillou

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    1 : Comment faire ?
    Plusieurs solutions :

    - 1) Utiliser un finaliseur soit en implémentant un destructeur, soit en utilisant explicitement une méthode Finalize().

    Problème : Comme c'est le Garbage Collector (GC) qui s'occupe de ça, on ne sait pas quand arrivera effectivement la destruction de l'objet...

    -2) L'interface System.IDisposable()

    Avec cette interface, soit elle est appelée depuis le finaliseur et c'est le GC qui finalement s'occupe de tout, soit on appelle explicitement la méthode Dispose() et c'est donc l'utilisateur qui demande la libération de l'objet.

    On peut aussi utiliser les blocs de portée using{} avec cette interface.

    2 : Est ce que le fait de le détruire va bien me fermer la connection ou faut-il que je passe par une methode intermédiaire qui me ferme la connection ??
    Pour la deuxième question, je sèche, je ne suis pas habitué de COM... Toutefois, si la connection au port COM est en mode managé tu devrais appeler Close() ou Dispose() pour cette connection dans la méthode Dispose() ou dans le finaliseur de ton objet.

    Si tu es en mode non géré (utilisation de l'API Win32 par ex.), tu devra explicitement fermer la connection (dans l'exemple, toujours avec les bonnes APIs), puis appeler un finaliseur ou Dispose().

  3. #3
    Membre régulier Avatar de legillou
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 178
    Points : 93
    Points
    93
    Par défaut
    salut et merci de ta reponse mais il y a des choses que je ne comprend pas :

    Alors le GC je voit ce que c'est, en gros c'est un gros aspirateur qui va nettoyer automatiquement ce dont tu ne te sert plus derrière toi? c'est ca?

    ensuite j'ai créé un destructeur a mon objet. J'ai vu dans les tutos que c'était quelque chose comme ca : ~monObjet() c'est plutot pas mal parce que ma fermeture de connection je peux la faire la dedans.

    Mais ce que je ne comprend pas c'est comment je fait appel à mon destructeur...
    Je n'ai pas compris l'utilisation de System.IDisposable()... j'ai de grosses lacunes je sais mais si tu avais un petit exemple je suis sûr que je pourrais en combler une
    merci d'avance !!

  4. #4
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut .

    je ne suis pas tout a fait d'accord avec la réponse au dessus .

    Si tu as un objet managé et que la fermeture de ta connextion ne doit pas forcément intervenir à un endroit précis alors tu n'as rien à faire . Le managé se genere tout seul grâce au garbage collector .

    Si tu as un objet natif alors tu implementes IDisposable est les utilisateurs font appel à la méthode Dispose pour être sur que tout est nettoyé (et le garbage collector fait également appel à Dispose si ça n'a pas été fait .)

    tu n'as que 2 solutions, la passage par un destructeur étant la plus mauvaise car cela dégrade les perf de l'application .

    Dans ton cas je te conseil de passer par IDisposable, fait une recherche sur le forum et sur les blog, c'est un sujet qui a été traité en long en large et en travers
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

Discussions similaires

  1. [c#]Comment forcer la destruction d'un objet précédemment créé?
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 5
    Dernier message: 24/07/2009, 14h29
  2. Réponses: 2
    Dernier message: 13/10/2007, 01h55
  3. destruction d'un objet
    Par akrobat dans le forum C++
    Réponses: 46
    Dernier message: 14/05/2006, 20h32
  4. Réponses: 1
    Dernier message: 09/07/2005, 18h16
  5. Réponses: 14
    Dernier message: 02/03/2005, 18h15

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