2010-07-20 5 views
1

Dans l'exemple de code suivant, filestream et streamreader seront-ils éliminés ou créeront-ils des fuites de mémoire? Est-il possible de coder cette fonction sans provoquer de fuite de mémoire?codant cette fonction sans fuite de mémoire! - veuillez nous informer

string ReadFile(string strPath) 
    { 
     using (FileStream fstream = new FileStream(strPath, FileMode.Open)) 
     { 
      using (StreamReader sreader = new StreamReader(fstream)) 
      { 
       return sreader.ReadToEnd().ToString(); //NOTE ITS RETURNED HERE...SO CAN IT GET DISPOSED AFTER THIS LINE? 
      } 
     } 
    } 

Merci

+0

Pour autant que je comprends .NET, ne disposant pas d'un filestream ne crée pas une (ressource) fuite , parce qu'il sera éliminé par le GC à un moment donné. C'est juste une bonne habitude de le jeter le plus tôt possible. –

+1

BTW pourrais-je demander pourquoi faites-vous un ToString() sur une chaîne? –

Répondre

5

using signifie directive:

try 
{ 
var iDisposable = new IDisposable(); 
//using iDisposable... 
} 
finally 
{ 
//here IDisposable's dispose 
} 

Alors oui les deux fstream et sreader seront éliminés.

+0

mais les objets sont retournés même avant que la disposition est appelée à droite? – Josh

+0

Oui, l'objet chaîne final résultant de toutes les opérations (la valeur de retour de la fonction) est correct, même après que les objets qui l'ont généré soient éliminés. – Bruce

+0

Les objets seront retournés et enfin le bloc sera appelé où IDisposable défini, FileStream par exemple, sera éliminé. –

0

La directive using appelle la méthode Dispose(), que la méthode d'instanciation retourne ou non dans le bloc.

S'il vous plaît noter, cependant, que vous pouvez utiliser la méthode System.IO.File.ReadAllText pour obtenir le même avec moins de code:

string ReadFile(string strPath) 
{ 
    return System.IO.File.ReadAllText(strPath); 
} 
+0

oui, je suis conscient de cela, mais je dois accéder à plusieurs reprises au fichier pour stocker et lire des données – Josh