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 :

[C#][2.0] Est-ce qu'appeler la méthode dispose d'une variable local a un interêt ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut [C#][2.0] Est-ce qu'appeler la méthode dispose d'une variable local a un interêt ?
    Bonjour,

    voici une méthode qui définit des variables locales de types DataSet et DataTable:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void Method()
    {
         DataSet myDataSet = new DataSet();
         DataTable myDataTable = new DataTable();
         [...]
     
         // Libère les ressources
         myDataSet.Dispose();
    }

    Otez moi d'un doute ?
    Est-ce qu'appeler la méthode Dispose avant la fin de la fonction a un interêt ?
    Hors de la fonction, les objets ne sont plus accessibles (ils ne sont transmis en paramètre à aucune autre méthode), le garbage collector collectera la mémoire lorsqu'il en aura envie.

    Si je comprends bien le fait d'appeler Dispose libère les ressources immédiatement (sans pour autant supprimer l'objet de la mémoire), c'est juste que n'ayant pas l'habiture, le fait d'appeler Dispose en fin de fonction me surprend mais la logique me dit de le faire.

    Merci pour vos conseils

  2. #2
    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
    Personnelement, je n'utilise Dispose que pour les connexions aux bases de données, les ouvertures de fichiers et la libération d'un tableau.

    En gros, Dispose est utile sur les objets qui pourrait poser problème à moyen terme. Parce que utiliser Dispose sur n'importe quoi, je n'y vois pas l'intérêt.

    Par contre, il y a une façon simple implicite d'appeler Dispose, en utilisant using. Une fois que le bloc using est fini, la méthode dispose Dispose est appelée sur le ou les objets correspondants.

  3. #3
    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
    Par défaut
    Citation Envoyé par Goldar
    Personnelement, je n'utilise Dispose que pour les connexions aux bases de données, les ouvertures de fichiers et la libération d'un tableau.
    C'est donc une erreur que tu fait .

    Avant de pouvoir répondre à ta question il faut savoir exactement ce que fait Dispose et pourquoi ça existe.

    Alors que fait Dispose ? Il ne fait pas que "libérer les ressources", ça c'est le garbage Collector qui s'en occupe en .NET. En effet lors de la la suppression d'un objet managé c'est le garbage collector qui s'en occupe en vérifiant qu'il n'existe plus de lien sur l'emplacement mémoire et le liberant l'emplacement mémoire de cet objet. Si le programme ne contient que des objet managé alors tout va bien le garbage collector et ton ami .

    Malheuresement (ou pas c'est a voir) un programme Winform ne contient pas que des objets managés (il n'y a pas que les winforms qui sont dans ce cas mais c'est le plus simple). En effet bcp de controles .NET sont effet des mappages de controle WIN32 (ou au moins une encapsulation). Il faut donc pouvoir libérer la mémoire utilisée par la partie non managé du controle. Or cette partie ne peux pas être atteinte ni géré par le garbage collector. C'est pour Dispose à été introduit. Dispose est la méthode qui demande la libération des ressources non managé du controle, composant, classe en question. D'ailleur une chose amusante est de constater que l'appel à Dispose ne détruit pas le code managé (faites le test :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SqlConnection connection = new SqlCOnnection();
    //utilisation
     
    connection.Dispose();
     
    if ( connection == null )
      MessageBox.Show("ok, c'est null ;-)" );
    else
      MessageBox.Show("Ben ça marche pas ?" );

    )

    voila en conclusion toute classe qui implémente IDisposable et donc qui a une méthode Dispose doit soit être utilsé avec un using soit avoir sa méthode Dispose d'appelé.

  4. #4
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonjour,

    et meilleurs voeux à tous les deux.
    Je vous remercie pour vos réponses.
    Je pense que ta réponse, DEV01, est très claire. Merci pour l'explication.

    A bientôt

  5. #5
    Membre confirmé Avatar de stephane.net
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 170
    Par défaut
    Bonjour Dev01 et merci pour ta réponse... sauf que je n'ai pas compris la conclusion

    toute classe qui implémente IDisposable et donc qui a une méthode Dispose doit soit être utilsé avec un using soit avoir sa méthode Dispose d'appelé.
    => Pourquoi SqlConnection implémente IDiposable si il n'y a pas d'intérêt à appeller sa méthode Dispose() ?

  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
    Sûrement pour fermer la connexion à la bd.. En gros Dispose appelle Close.
    Mais bon, je m'avance peut être un peu trop

  7. #7
    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
    Par défaut
    Citation Envoyé par stephane.net
    Bonjour Dev01 et merci pour ta réponse... sauf que je n'ai pas compris la conclusion



    => Pourquoi SqlConnection implémente IDiposable si il n'y a pas d'intérêt à appeller sa méthode Dispose() ?
    Qui a dit qu'il n'y a pas d'interet à appelé Dispose sur un objet SqlConnection ? j'ai dit exactement l'inverse ...

    De plus même si le fait d'appeler Dispose sur SqlConnection ferme effectivement la connexion la méthode "prope" c'est Close puis Dispose .

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

Discussions similaires

  1. Appel de méthode protected dans une classe fille
    Par Le Mérovingien dans le forum C++
    Réponses: 11
    Dernier message: 05/06/2012, 16h04
  2. Appeler un USF nommé par une variable
    Par Arrow_V dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/01/2009, 00h23
  3. Réponses: 7
    Dernier message: 01/02/2008, 16h12
  4. Réponses: 7
    Dernier message: 08/03/2007, 09h23
  5. [VBA-E] Appel de fonction/procédure depuis une variable
    Par truman dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/05/2006, 16h20

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