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

VB.NET Discussion :

StreamReader & StreamWriter - Close et Dispose


Sujet :

VB.NET

  1. #1
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut StreamReader & StreamWriter - Close et Dispose
    Bonjour,

    Je ne suis pas encore alaise avec StreamReader & StreamWriter et je viens de m'apercevoir qu'il faut tjrs les fermer apres chaque utilisation. J'ai une petite question toute bête concernant "Dispose".


    Admettons la procédure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim SR As System.IO.StreamReader
     
    SR = "x"
    SR.Close
     
    SR = "y"
    SR.Close
    Est-ce utile de mettre un "SR.Dispose" après chaque utilisation ds la procédure (2 ds cet exmple) ou bien 1 seul suffit en fin de procédure ? Peut-être aussi qu'un seul "SR.Dispose" suffirait, placé à la fermeture d'une Form par exemple ?

    Merci de m'éclairer sur ce petit détail qui me turlupine

  2. #2
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut
    Assurément, lorsque tu dispose de ton stream (writer ou reader) tu ne pourras pas l'utiliser ensuite, car tu laisses tomber les ressources utiliser pour cet objet. Donc faut pas le faire 2 fois.

    À savoir s'il faut le fermer après utilisation ou le fermer sur la fermeture de formulaire, je peux pas te dire ce qui est mieux par manque d'expérience, mais je serais tenté de le faire après la fin de l'utilisation, simplement pour ne pas l'oublier dans mon code.

    Mais bon, quelqu'un peut sûrement nous apporté plus de précision...

  3. #3
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    Salut

    Tu dois faire un close une fois le streamReader utilisé, sinon tu ne pourras pas lire un autre flux.

    Le Dispose dit au systeme que tu n'utiliseras plus cette variable, qu'il peut donc allouer l'espace mémoire à autre chose.

    Le Dispose se fait donc une seule fois et a la fin.

  4. #4
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Citation Envoyé par arnomedia Voir le message
    Admettons la procédure suivante :
    Est-ce utile de mettre un "SR.Dispose" après chaque utilisation ds la procédure (2 ds cet exmple) ou bien 1 seul suffit en fin de procédure ? Peut-être aussi qu'un seul "SR.Dispose" suffirait, placé à la fermeture d'une Form par exemple ?
    Il n'y a qu'un seul flux de fichier qui peut avoir des droits sur un fichier (droit en écriture). Les classes héritant de la classe Abstraite font appel à l'API de Windows, Windows va lui même se charger de verrouiller le fichier. La méthode Dispose sert à libérer les droits d'un fichier à d'autres programmes ainsi que les ressources natives utilisées par la classe.

    Le second appel de la méthode Dispose doit normalement déclencher une exception ObjectDisposedException. Pour pouvoir réutiliser cet objet il faut l'instancier à nouveau.

  5. #5
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    merci les gars !

    C'est nettement plus claire maintenant.

    Si j'ai bien compris, meme si j'utilise le fichier en lecture, je dois dabord faire un ".Close" avant de passer en écriture. Que la variable du StreamReader s'appelle "toto" et celle du StreamWriter "titi" on s'en fou, faut fermer d'adord ! C'est bien ça ?

  6. #6
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut
    oui a cause de la gestion de windows comme Harz a dit

  7. #7
    Membre très actif Avatar de arnofly
    Homme Profil pro
    Développeur Web / Webdesigner
    Inscrit en
    Mai 2007
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web / Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 413
    Par défaut
    OK, et bien merci à tous.
    Du coup j'ai fais un peu de nettoyage ds mon code

    Bonne journée

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    et sur certaines classes, dispose appelle close
    (voir avec reflector)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    C'est pas plutôt l'inverse ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    non, ca serait pas drôle

    quand tu disposes un datareader, t'en as plus besoin donc tu peux le closer
    par contre quand tu le close, t'en as ptete encore besoin, donc faut pas le disposer
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    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
    Au contraire, en général lorsqu'il y a une méthode Close et une méthode Dispose, la méthode Close appelle le Dispose et non l'inverse.

    Pour preuve, le code de la méthode Close des classes Stream, StreamWriter, StreamReader et d'autres sûrement (merci reflector ^^)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public override void Close()
    {
        this.Dispose(true);
        GC.SuppressFinalize(this);
    }
    Évidemment, suivant les classes la méthode Close n'appelle pas forcément le Dispose, cela dépend de l'implémentation

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    je me fiais au datareader que j'avais dejà regardé à une époque et qui lui fait l'inverse (vive l'homogénéité du code )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            Me.Close
        End If
    End Sub
    mais dans un sens fermer un fichier, c'est autre chose ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut


    En résumé, pour un débutant (comme moi!), vaut mieux ne pas se fier à Microsoft et appeller les deux méthodes pour ne pas se tromper!


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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    non car sinon tu disposes 2x le stream

    le mieux est d'utiliser reflector, quand on veut savoir ce que ca fait exactement, au moins on peut etre sur

    ou sinon msdn, au début on a l'impression que c'est étrange et incomplet (un peu différent de vb6)
    mais une fois qu'on a compris comment msdn s'utilise on s'apercoit que tout est bien documenté, et d'ailleurs sur l'aide de close du stream c'est surement écrit que ca dispose ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut
    Ouais j'avais compris, ce que je voulais dire c'est de pas appeller la méthode Close en se disant que probablement ça dispose ou vice-versa, mieux vaut clairement appeller ceux qu'on veut quand nécessaire et pas se fier à ce que l'on croit...

    Mais bon je m'égare, il est tard, je rentre...

  16. #16
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Ou alors pour éviter d'avoir à se poser trop de question, se servir de "Using",
    Exemple tiré du Snippet "Lire un fichier délimité": (il porte sur un TextFieldParser mais c'est pareil pour un Stream)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim champs As String()
    Using parseur As New TextFieldParser("C:\Test.txt")
        parseur.SetDelimiters(",")
        While Not parseur.EndOfData
            champs = parseur.ReadFields()
            ' Ajouter le code pour utiliser les données de la variable champs
        End While
    End Using
    Comme on peut le voir il n'y a ni appel à Close ni à Dispose mais c'est ce que fait le End Using, il appelle implicitement Dispose (qui lui appelle Close)

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/07/2009, 09h47
  2. Réponses: 6
    Dernier message: 01/10/2008, 11h08
  3. .close ou .dispose pour une form
    Par olibara dans le forum C#
    Réponses: 14
    Dernier message: 09/05/2008, 22h29
  4. [JDialog]Close() ou dispose() ?
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 12/12/2005, 11h46

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