2017-08-04 1 views
-1

Si j'ai une classe avec les membres de flux de fichiers comme ceci:Comment fermer un objet de flux StreamReader/StreamWriter en tant que membre de la classe?

public class FooBar 
{ 
    private StreamReader reader; 
    private StreamWriter writer; 

    public FooBar(string readerFilePath, string writerFilePath) 
    { 
     reader = new StreamReader(readerFilePath); 
     writer = new StreamWriter(writerFilePath); 
    } 

    ... 
} 

alors comment puis-je fermer ces flux?

Il semble qu'ils soient fermés par défaut lors de la destruction de classe, mais je dois alors utiliser writer.Flush() ce qui ne sonne pas bien.

+2

FooBar devrait mettre en œuvre IDisposable. Voir [Implémenter IDisposable correctement] (https://msdn.microsoft.com/fr-fr/library/ms244737.aspx?f=255&MSPPError=-2147217396) et [Implémenter IDisposable correctement] (https://stackoverflow.com/a/18337005/2066142) – KiwiPiet

+0

Je ne comprends toujours pas la raison derrière l'interface IDisposable si je dois appeler explicitement la méthode Dispose(). Dans mon cas particulier, je ne peux pas utiliser le mot clé 'using'. Si j'essaie d'appeler 'writer.Close()' dans le destructeur (comme je le ferais en C++), j'obtiens une exception indiquant que le flux a déjà été fermé. –

+0

Peut-être que je dois apprendre comment le garbage collector fonctionne ... –

Répondre

0

utilisation en utilisant le bloc

using(reader = new StreamReader(readerFilePath)) 
{ 
    //your code 
} 

des liens ci-dessous: Fournit une syntaxe pratique qui garantit l'utilisation correcte des objets IDisposable.

De MSDN:

C#, à travers le .NET Framework Common Language Runtime (CLR), libère automatiquement la mémoire utilisée pour stocker des objets qui ne sont plus nécessaires . La libération de la mémoire est non déterministe; la mémoire est publiée chaque fois que le CLR décide d'effectuer la récupération de place. Toutefois, il est généralement préférable de libérer des ressources limitées telles que les fichiers et les connexions réseau aussi rapidement que possible.

L'instruction using permet au programmeur de spécifier quand les objets qui utilisent les ressources doivent les libérer. L'objet fourni à l'instruction doit implémenter l'interface IDisposable. Cette interface fournit la méthode Dispose, qui doit libérer les ressources de l'objet. En d'autres termes, l'instruction using indique à .NET de libérer l'objet spécifié dans le bloc using une fois qu'il n'est plus nécessaire.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement

What is the C# Using block and why should I use it?