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 :

"Dispose" or not


Sujet :

C#

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Points : 366
    Points
    366
    Par défaut "Dispose" or not
    Hello,

    Comment libérer un objet de la mémoire ? Sous VB6 je finissais par :
    Mais sous C# je vois beaucoup de codes sources où peu de personne utilise le Dispose

    Dans mon exemple j'ai une classe qui permet de lire les fichier Ini. Elle est déclarée, utilisée et plus rien ; Ne doit- on pas finir par un Dispose ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void Load_ini()
    {
      IniFile ini = new IniFile(); 
     
      ini.Load(Path.Combine(Pathini,"configuration.ini"));
      msTPPPath = ini.GetValue("FOLDER", "DEFAULT");
      mID_UAC = int.Parse(ini.GetValue("UAC", "ID"));
     
    }

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    dispose sert uniquement pour les classes dont une partie de la mémoire est gérée par l'os

    quand tu utilises un string, ou un system.Drawing.size, ou 70% des classes du framework, la mémoire allouée l'est par la CLR (donc .net)

    par contre il y a certaines classes qui n'ont pas été codée totalement en .net
    comme le system.Drawing.image qui ne fait qu'utiliser la dll dgi+ (gdi+ alloue sa mémoire lui meme, et le system.Drawing.image n'a qu'un pointeur pour retrouver l'image dans gdi+), ou encore les connexion aux bases


    pour les objets gérés par la clr, pas besoin d'avoir de sub dispose (d'ailleurs tu verra qu'il y a plein de classes qui ne l'ont pas)

    les objets gérés en partie par l'os ont nécessairement la sub dispose (en fait ils implémentent IDisposable), cette méthode appelle la libération de mémoire externe

    après il y a à peu près le même mécanisme qu'en vb6
    si tu as une variable, elle prend de la mémoire
    si c'est un objet et que tu le mets dans une autre variable, les 2 pointes vers la meme référence
    si tu mets une de tes variables à nothing, l'instance est encore pointée par l'autre variable
    une fois l'autre variable mise à nothing, l'instance n'est plus pointée, elle sera supprimée automatiquement de la mémoire (pas de manière instantané par contre, seulement quand le GC aura le temps ou la nécessité de faire de la place)

    donc quand tu écris une classe, et que tu n'appelles pas des dll non .net il ne sert à rien d'implémenter l'interface IDisposable

    NB :
    - les objets sont mis à nothing automatiquement quand ils sont hors portée (par exmple un dim a as string dans un sub, à la fin du sub, a est mis à nothing)
    - on peut oublier d'appeler Dispose sur un objet, le GC le fera, quand il voudra libérer la mémoire .net de l'objet, l'appel à dispose sera fait automatiquement avant (voir finalize pour plus d'infos)
    - appelere quand même Dispose libère la mémoire externe tout de suite, il est préférable de ne pas l'oublier
    - quand on écrit une classe qui contient des objets disposable, il peut etre utile d'implémenter l'interface IDisposable pour pouvoir appeler dispose sur ces objets
    - Using / End Using est utile pour les objets disposable
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Points : 366
    Points
    366
    Par défaut
    Merci de ta réponse ! Fort ce .NET...

    Je viens de me mettre à C#, tardivement après beaucoup beaucoup d'années de VB6, et il me plait de plus en plus ce language et j'ai une impression d'avancer plus rapidement dans mes petits projets...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    passé de vb6 à vb.net, je ne regrette pas non plus, beaucoup moins de code à taper, exit les crashs de l'exe non interceptables et non reproduisibles en debug ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

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