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#]Destructeur, problème quand je quitte de programme


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Par défaut [c#]Destructeur, problème quand je quitte de programme
    Bonjour a tous,
    comme vu dans plusieurs tut, le destructeur se déclare comme toujours :

    ~Form1
    {
    }

    Seulement quand je quitte mon programme, le destructeur n'est pas appellé...

    Je suis sous vstudio 2005 et je déclare mon destructeur juste en dessous du constructeur de ma Form.

    merci

  2. #2
    Membre expérimenté Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Par défaut
    Salut,

    Selon l'MSDN:
    Le programmeur n'a aucun contrôle sur le moment où le destructeur est appelé car cela est déterminé par le garbage collector. Le garbage collector recherche les objets qui ne sont plus utilisés par l'application. S'il considère qu'un objet est candidat à la destruction, il appelle le destructeur (s'il y a lieu) et libère la mémoire utilisée pour stocker l'objet. Les destructeurs sont également appelés à la fermeture du programme.
    T'es sûr que le programme ne s'arrête pas brutalement après un bug fatal?
    Qu'est ce que tu as mit comme signal pour vérifier que ton destructeur a été (ou non) bien executé?

  3. #3
    Membre confirmé Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Par défaut
    Je lance une messagebox dans le destructeur. De toutes facon j'ai tester au debugger et le prog ne passe pas dedans.

  4. #4
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Bien que cette syntaxe soit disponible en dotnet C#... Elle est, on peut le dire, complètement inutile. Il est vrai que dotnet s'occupe de libérer automatiquement les objets qui ne sont plus utilisés... Mais celà n'arrivera que quand Dotnet en ressentira le besoin !

    Par contre, si tu veux que ta classe ait une sorte de méthode destructeur, il te faudra implémenter l'interface IDisposable et implémenter la méthode Dispose() dans laquelle tu écris ton code pour libérer les ressources.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class ClassA : IDospable
    {
      public void Dispose()
      { ... }
    }
    Et pour que la méthode Dispose soit autimatiquement appelé, tu devras faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ClassA maClass = new ClassA();
    using(maClass)
    {
       ...
    }

  5. #5
    Membre confirmé Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Par défaut
    Hé bien merci beaucoup.

    Le système est un peu mal fait ce coté la je trouve...
    enfin merci encore

  6. #6
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    C'est vrai que dans le cas où on veut que le destructeur soit appelé implicitement à un moment précis, ça donne un peu plus de boulot pour y arriver... Mais les problèmes de saturation de mémoire suite à un oubli de libération de la mémoire occupée par un objet, c'est fini !

    Au final, le développeur utilisera le destructeur (avec Dispose) uniquement si il veut fermer une connexion à une bd, une ouverture de fichier, etc. Et n'aura plus à se demander: Est-ce que je libère bien la mémoire de cet objet ?!

  7. #7
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Citation Envoyé par skysee
    Le système est un peu mal fait ce coté la je trouve...
    Non.
    C'est le codeur qui a du mal à se faire au codage haut-niveau

    La notion de destructeur n'a pas de sens en C#. Elle a été ajoutée pour faire plaisir aux codeurs C++, mais normallement, le gros gros avantage de C# et Java par rapport à C++, c'est qu'ils tournent sur une plateforme managée, dans une machine virtuelle, et donc la gestion de la mémoire n'est plus du ressort du développeur.

    Si tu veux gérer ta mémoire à l'octet prêt, alors il faut faire du Win32, pas du .Net

  8. #8
    Membre confirmé Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Par défaut
    Citation Envoyé par Mose
    Non.
    C'est le codeur qui a du mal à se faire au codage haut-niveau

    La notion de destructeur n'a pas de sens en C#. Elle a été ajoutée pour faire plaisir aux codeurs C++, mais normallement, le gros gros avantage de C# et Java par rapport à C++, c'est qu'ils tournent sur une plateforme managée, dans une machine virtuelle, et donc la gestion de la mémoire n'est plus du ressort du développeur.

    Si tu veux gérer ta mémoire à l'octet prêt, alors il faut faire du Win32, pas du .Net
    Tu as raison oui, mais ce qui me chifonne, c'est que je peux implémenter mon destructeur comme en c++ et que ca ne me retourne aucune erreur lors de la compilation, mais que le pointeur ne passe pas dedans quand je quitte l'application.

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par Mose Voir le message
    La notion de destructeur n'a pas de sens en C#.
    En effet, d'après ce que je lis à droite et à gauche, le destructeur au sens C++ a perdu toute son utilité en C# si son appel est devenu imprévisible.

    La solution palliative étant à première vue l'interface IDisposable, using(){} et consors.

    Je ne l'ai pas vu documenté, mais après un petit test, je vois qu'il est possible de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using ( Base b = new Derived(1), b2 = new Derived(2) ) {}
    mais pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Base b = new Derived(1), b2 = new Derived(2);
    Derived d = new Derived(3);
    using ( b, b2, d ) {}
    Existe-t-il une solution à ces deux problèmes ? (objets utilisés différents ou créés plus amonts)
    La solution de faire des using imbriqués me semble très peu élégante.

    Citation Envoyé par Mose Voir le message
    Elle a été ajoutée pour faire plaisir aux codeurs C++
    A mon avis, tu t'avances un peu en disant cela
    Si c'est dit sur le ton de la plaisanterie, ok. Sinon c'est prendre un peu les codeurs C++ pour des vieux rigides! On n'apprend pas un nouveau langage sans en accepter les règles. Je ne vois pas pourquoi, en concevant C#, on se serait dit "Oh laissons le destructeur sinon y en a qui vont raler parce qu'ils ont l'habitude de l'utiliser." en sachant très bien que l'utilisation du destructeur allait devenir problématique.

    Non, à mon avis il y a une raison technique, un cas, que je ne vois pas, où le destructeur pourrait servir. Et la je fais appel à vos expériences : quelqu'un l'a-t-il déjà utilisé et pourquoi ?

    Merci

    Oui, c'est chiant
    Je ne vois pas ça comme ça. Je dirais que c'est déroutant au premier abord.

    mais c'est la philosophie de la techno
    Exactement.

    NB : désolé de déterrer les sujets

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 23/03/2006, 19h30
  2. Conserver des valeurs quand on ferme le programme
    Par Yepazix dans le forum Langage
    Réponses: 1
    Dernier message: 05/02/2006, 15h59
  3. [Debutant] Problème de fraction dans un programme
    Par SAKDOSS dans le forum Débuter
    Réponses: 4
    Dernier message: 22/10/2005, 18h38
  4. Problème installation SQL Server 2000 (programme antérieur)
    Par 404Found dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/04/2005, 10h24
  5. Réponses: 1
    Dernier message: 16/05/2004, 17h56

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