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

Framework .NET Discussion :

[1.1] Comment supprimer un objet d'une collection mais également sa référence ?


Sujet :

Framework .NET

  1. #1
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 382
    Points
    5 382
    Par défaut [1.1] Comment supprimer un objet d'une collection mais également sa référence ?
    Bonjour,

    J'ai créé plusieurs dictionary.
    Ces dictionary sont représenté par des TreeNode. (je parle de TreeNode parce que j'ai le même pb qu'avec mes dictionary).

    mon "problème" arrive lors de la suppression : (est-ce un pb ou moi qui n'ai rien compris)

    Quand je fais TreeNode.Remove ou Dictionary.Remove, dans les 2 cas ça supprime mon objet de la collection.
    Moi, je voudrais que ça supprime aussi l'objet lui-même.
    Comment faire ?
    En le supprimant de la collection et après en faisant MonObjet = null (ou Nothing en VB) ? Mais ça n'a pas l'air de marcher (je ne passe pas dans le destructeur)

    Merci

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Cela veut tout simplement dire que la méthode Add de la collection ajoute une copie de l'objet et non sa référence. Donc à toi d'implémenter ce qui n'est pas par défaut en dérivant et surchargeant les méthodes Add notamment de tes collections pour que le passage de l'objet en paramètre se fasse par référence.

  3. #3
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 382
    Points
    5 382
    Par défaut
    Ok, je vais tenter de refaire les méthodes Add et Remove.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Les collections quelles qu'elles soient ajoute TOUJOURS la référence de l'objet, quitte à faire du boxing même avec des types primitifs.
    En aucun cas, elles ne font une copie d'un objet.

    Si tu veux en etre sure rien de plus simple, fait une classe qui possède un constructeur de copie et un nom comme une string, et chaque fois que le constructeur de copie ou vide est appelé, ajoute un caractère à la fin du string...
    Ensuite instancie cette classe et ajoute la a la collection Dictionnary pk pas.
    Ensuite fait une comparaison des noms des deux... et là surprise et oui, déjà c'est la même référence et donc le meme objet et pas une autre instance.

    Ensuite lorsque tu supprime un objet du dictionnary, si celui-ci est référencé quelque part ailleurs, il ne peut en aucun cas être supprimé physiquement !
    N'oublie pas d'ailleurs que dès lorsque tu travail en C# ou C++ managed, tu travail avec un GC (Garbage Collector) et ce n'est donc pas toi qui décide de la libération physique d'un objet, mais le GC.
    Autrement dit, meme si tu annule la seule référence vers l'instance ou la supprime d'un dictionary, l'objet ne sera supprimé que lorsque le GC lancera son thread, et ca, ca peut arriver n'importe quand, mais certainement pas quand tu le souhaite.

    Le seul moyen d'avoir une libération déterministe d'un objet en mémoire, et d'utiliser des objets qui dérivent tous de l'interface IDisposable. Dans ce cas, seulement tu pourras déterminer toi meme le moment exact de la libération de l'objet, et encore, là aussi il y a des restrictions. De plus, pour libérer l'objet, il faut appeler explicitement la méthode Dispose() et non pas supprimer toute référence, ce qui ne t'empeche pas de supprimer la référence à l'objet bien entendu.

  5. #5
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 382
    Points
    5 382
    Par défaut
    cinemania, merci pour tes lumières sur le sujet.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/09/2006, 17h21
  2. Réponses: 3
    Dernier message: 31/05/2006, 14h12
  3. Réponses: 17
    Dernier message: 18/03/2005, 15h56
  4. Réponses: 14
    Dernier message: 15/01/2004, 01h15

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