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 :

Supprimer les Objets


Sujet :

C#

  1. #1
    Membre habitué Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Points : 155
    Points
    155
    Par défaut Supprimer les Objets
    Bonjours à tous

    Je cherche comment détruire les objets personnels une fois que l'on en a plus besoin ... je sais qu'il y a un mecanisme automatique ( Garbage collector) mais cela me semblerai plus propre de les detruire au fur et à mesure de leur fin d'utilisation...


    Merci d'avance pour vos réponses

    Patrick

  2. #2
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Oui c'est effectivement le Garbage Collector qui va les détruire. Pour indiquer au CG qu'il peut collecter ton objet, il te suffit de lui affecter la valeur null :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    myObject obj = new MyObject();
    // utilisation de l'instance obj
    ...
     
    // Libération de obj
    obj = null;
     
    // A partir de ce moment, obj peut-être nettoyé par le GC.

  3. #3
    Membre habitué Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Points : 155
    Points
    155
    Par défaut Merci
    Merci beaucoup ...

  4. #4
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    repond peut-etre plus a ta question...

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    pour expliciter un peu (pas totalement)

    certaines classes implémente IDisposable avec la sub Dispose
    cette méthode sert à détruire les ressources non managées, par exemple, pour les images le framework ne fait rien, il utilises windows, le garbage collector ne sait rien faire la dessus, c'est donc à windows qu'il faut préciser que l'espace mémoire l'image peut etre supprimée, la sub dispose sert à ca

    le GC détruit une instance quand plus aucune variable ne pointe dessus, enfin il est plus intelligent que ca car sinon il irait pas loin (car si A référence B et que B référence A ...)
    donc mettre à null les variables rapidement
    enfin ca doit etre en grande partie automatique, quand le code sort de la portée d'une variable elle est mise à null

    au moment ou il ramasse une instance d'objet, (...) il appelle la méthode Dispose si ca implémente IDisposable
    puis libère l'espace occupé par le coté managé de l'instance

    donc appeler dispose sur les classes qui l'implémente permet de libérer la mémoire plus rapidement

    le GC fait le ménage quand windows lui dit que la ram libre se fait rare
    GC.Collect permet de forcer le garbage collector à faire le ménage

  6. #6
    Membre habitué Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Points : 155
    Points
    155
    Par défaut The end
    Merci à tous pour vos réponses

    Patrick JEAN

  7. #7
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Gold Bug Voir le message
    Oui c'est effectivement le Garbage Collector qui va les détruire. Pour indiquer au CG qu'il peut collecter ton objet, il te suffit de lui affecter la valeur null :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    myObject obj = new MyObject();
    // utilisation de l'instance obj
    ...
     
    // Libération de obj
    obj = null;
     
    // A partir de ce moment, obj peut-être nettoyé par le GC.
    Euh, c'est COMPLETEMENT faux. (je mets en majuscule parce que c'est complètement faux).

    On ne manipule jamais les objets les objets en C#, uniquement des références dessus. "obj" n'est pas un objet ; ce n'est qu'une référence.
    Ecrire "obj = null" ne fait que couper le lien entre une référence et l'objet. Je dis bien "une" référence parce que rien ne nous empêche d'en créer tout plein partout.

    En gros, il existe deux types de références :
    - les membres de classe
    - et celles déclarées au sein d'une méthode (et plus généralement, d'un bloc).

    Le GC maintient un graphe d'accessibilité des objets. Un objet est vivant s'il a une référence dans un bloc vivant ou dans un objet vivant (bon, OK, je schématise)
    Quand on sort d'un bloc ( un if { ... } ou une void f() { ... } par exemple), le GC supprime les références qui y ont été définies. Et après, quand l'envie lui repnd, il va effectivement détruire les objets qui n'ont plus de référence vivante nulle part.

    Le pattern IDisposable, c'est autre chose. La méthode Dispose n'est jamais appelée automatiquement. Elle ne s'exécute que si il y a machinTruc.Dispose() dans le code, ou avec la syntaxe using(Machin m = new Machin()) { ... } Ce pattern est utile quand on veut explicitement libérer une ressource de façon déterministe, et non pas quand le GC a bien envie de nettoyer tout ça. Il n'a rien à voir avec le GC.

  8. #8
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Euh, c'est COMPLETEMENT faux. (je mets en majuscule parce que c'est complètement faux).
    On ne manipule jamais les objets les objets en C#, uniquement des références dessus. "obj" n'est pas un objet ; ce n'est qu'une référence.
    1. Si tu me relis attentivement, tu verras que dans mon exemple, dit que obj était une instance.

    2. On peut encore compléter ton explication sur le Garbage Collector en décrivant les différentes générations de collecte, ou comment le framework permet de ressusciter une instance de classe qui a déjà été collectée...

    mais bon... quand un mec déboule sur un forum et demande "comment détruire les objets personnels une fois que l'on en a plus besoin", c'est quand même bien de se mettre à sa porté, parce qu'il est évident à la lecture de la question que le gars ne va pas passer sa certif à la fin de l'année.

  9. #9
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Gold Bug Voir le message
    1. Si tu me relis attentivement, tu verras que dans mon exemple, dit que obj était une instance.
    Ce qui est faux. obj n'est pas une instance. Ce n'est que l'une des étiquettes collées a l'objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
      Bidule obj = new Bidule(); // on a créé l'objet, on a une référence dessus => vivant
      Bidule obj2 = obj; // deux références sur l'objet
      obj = null; // plus qu'une référence sur l'objet
    } // sortie de bloc : l'objet n'est plus accessible, il sera vraiment supprimé de la mémoire par le GC un de ces 4.
    A moins d'utiliser du code unsafe, tu ne peux pas manipuler directement des classes en C# (alors que des structs, oui, mais c'est une autre histoire ) Et remettre a "null" une référence dont la portée se limite à un bloc ne sert à rien.

    Le but du GC est précisément que l'on n'ait pas a se soucier de lui.

    Donc, pour repondre a la question initiale : il est impossible de detruire explicitement les objets en C# (par detruire, j'entends liberer la mémoire qu'ils occupent). Ce qui est possible, par contre, c'est de libérer les ressources non managées qu'une classe possède (un fichier, une connexion de base, un handle de fenêtre, etc.), parce qu'une telle classe possède une méthode Dispose que l'on peut appeler.

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

Discussions similaires

  1. [VI-2003] Supprimer les croix autour des objets
    Par wissem.ba dans le forum Visio
    Réponses: 1
    Dernier message: 16/08/2012, 16h02
  2. [DeskI XiR2] Supprimer les objets personnels
    Par monsoleil dans le forum Débuter
    Réponses: 1
    Dernier message: 11/05/2010, 03h58
  3. Supprimer les objets d'une BD externe
    Par chim33 dans le forum VBA Access
    Réponses: 3
    Dernier message: 09/04/2009, 15h40
  4. Supprimer tous les objets d'un USER
    Par farenheiit dans le forum Administration
    Réponses: 2
    Dernier message: 27/11/2007, 10h28
  5. TIBTransaction.Rollback ne supprime pas les objets créés dans le script
    Par sangkookay dans le forum Connexion aux bases de données
    Réponses: 2
    Dernier message: 02/10/2007, 14h26

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