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 :

Détruire correctement une instance


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut Détruire correctement une instance
    Salut,

    J'ai une classe dans laquelle je créé:
    • Une DbProviderFactory
    • Une connection à une base de données
    • Une commande
    • Et éventuellement une transaction

    Pour être certain que tout soit bien détruit, ma classe implémente IDisposable.

    Je peux donc utiliser ma classe dans un bloc using(){}

    Que dois-je mettre dans la méthode Dispose() pour être certain que tout est bien détruit? Dois-je faire un dispose de tous les objets créés dans la classe ou bien cela se fera-t-il de manière implicite grace au using?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void Dispose()
    {
    if(maTransaction!= null)
         maTransaction.Dispose();
    maCommande.Dispose();
    maConnection.Close();
    maConnection.Dispose();
    }
    Merci d'avance de vos suggestions.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Change
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    maConnection.Close();
    maConnection.Dispose();
    En
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maConnection.Dispose();
    Car Close et Dispose sont identiques en terme de fonctionnalité, donc appeler une des 2 suffit car Close appelle Dispose en interne (suivant les implémentation c'est Dispose qui appelle le Close en interne, ce qui revient au même au final).

  3. #3
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Meme chose pour la transaction et la commande alors?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Meme chose pour la transaction et la commande alors?
    Il n'y a pas de méthode Close sur ces objets donc tu ne peux faire que le Dispose. Enfin si j'ai bien compris la question

    Si jamais ton objet command ou connection peut être null il faudra rajouter un petit test avant d'appeler la méthode Dispose dessus, mais sinon ça me semble correct.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Meme chose pour la transaction et la commande alors?

    A+
    Tu n'as pas de Close sur ton objet Command donc tu dois passer par Dispose

  6. #6
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    J'ai lu qu'il vallait mieux éviter de faire appel à dispose() (forcer le dispose()) dans la mesure où il faut laisser faire le garbage collector.

    Cela a-t-il un interet en définitive?

    Par ailleurs, y a-t-il un moyen pour forcer l'utilisation de cette classe dans un using?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    J'ai lu qu'il vallait mieux éviter de faire appel à dispose() (forcer le dispose()) dans la mesure où il faut laisser faire le garbage collector.
    Ca ressemble à du nimp, çà On a beau être en environnement managé, ça nous dispense pas de libérer les ressources autres que la mémoire si l'on sait qu'on en a plus besoin.

    Autant que je sache, le garbage n'appelle jamais la fonction Dispose. Il appelle éventuellement le finaliseur, mais le pattern Dispose est juste une bonne pratique, facilitée par le mot-clé using.

    D'où la fonction protected override Dispose(bool) qu'on retrouve partout dans le FX, qui est appelée à la fois par le finaliseur et par le Dispose, afin de mutualiser le code que l'on veut exécuter aussi bien lors d'une "destruction" déterministe que non-déterministe.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    J'ai lu qu'il vallait mieux éviter de faire appel à dispose() (forcer le dispose()) dans la mesure où il faut laisser faire le garbage collector.

    Cela a-t-il un interet en définitive?

    Par ailleurs, y a-t-il un moyen pour forcer l'utilisation de cette classe dans un using?

    A+
    Dans la continuité de ce que dit Guulh, quand il y a un dispose, tu l'appeles, c'est la regle. La logique du Dispose ne repond pas à une exigence du GC (la memoire, il la retrouvera que tu l'appeles ou pas), mais de gestion deterministe des ressources. Qu'il reste un handle vers un fichier en terme de conso memoire, c'est negligeable, que ce fichier reste ouvert en accès potientiellement exclusif, c'est beaucoup plus problematique, car il peut se passer de longues minutes avant que le GC ne passe.

    La finalité de tout ca, etant : Appeles le Dispose() ! =p

Discussions similaires

  1. [PHP 5.2] Détruire une classe (et non une instance)
    Par Halleck dans le forum Langage
    Réponses: 5
    Dernier message: 06/02/2010, 09h54
  2. Détruire une instance d'une classe
    Par joy84 dans le forum JSF
    Réponses: 6
    Dernier message: 03/12/2009, 09h38
  3. Réponses: 2
    Dernier message: 17/03/2008, 10h58
  4. Oracle - Détruire une instance
    Par Bahan dans le forum Oracle
    Réponses: 5
    Dernier message: 24/04/2006, 16h17
  5. [VB6]Passer le focus à une instance précedente
    Par Jeremiah dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 16/09/2003, 10h01

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