J'ai une classe qui lit les données d'un flux de fichier et écrit dans un autre. Je suis préoccupé par la fermeture des flux après la fin du traitement dans closeFiles().Fermeture d'un fichier sans utiliser l'aide
Comment gérez-vous la possibilité que l'élimination d'un flux puisse déclencher une exception empêchant l'élimination de l'autre flux d'être appelé?
Dois-je appeler à proximité et disposer sur les flux ou juste un? Que se passe-t-il si j'attrape des erreurs du flux et que je continue avec le déplacement et la suppression des fichiers comme indiqué dans lastOperation()?
Dans un monde parfait, j'aimerais utiliser une instruction using dans une liste d'initialisation de style C++, mais je suis à peu près sûr que ce n'est pas possible dans C#.
EDIT: merci pour les réponses rapides les gars. Donc ce que je devrais faire est de tirer IDisposable puis modifiez le constructeur et ajouter les deux méthodes comme celui-ci ?: disposant
~FileProcessor()
{
Dispose(true);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
sw.Flush();
}
closeFiles();
disposed = true;
}
}
C'est essentiellement ce que je fais:
class FileProcessor
{
private string in_filename;
private string out_filename;
private StreamReader sr;
private StreamWriter sw;
bool filesOpen = false;
public FileProcessor(string filename)
{
in_filename = filename;
out_filename = filename + ".out";
openFiles();
}
~FileProcessor()
{
closeFiles();
}
private void openFiles()
{
sr = new StreamReader(in_filename);
sw = new StreamWriter(out_filename);
filesOpen = true;
}
private void closeFiles()
{
if (filesOpen)
{
sr.Close();
sw.Close();
sr.Dispose();
sw.Dispose();
filesOpen = false;
}
}
/* various functions to read, process and write to the files */
public void lastOperation()
{
closeFiles();
File.Delete(in_filename);
Directory.Move(out_filename, outdir + out_filename);
}
}
Re the Edit: Vous devriez toujours perdre le destructeur. Et vérifiez sr, sw individuellement. –
Merci Henk, j'ai vu votre addition sur la vérification individuelle après avoir fait l'édition, c'est déjà dans mon code :).J'ai obtenu le 'conseil' pour garder le destructeur de http://msdn.microsoft.com/en-us/library/system.idisposable.dispose(VS.71).aspx qui suggère "Employer la syntaxe de destructeur de C# pour le code de finalisation. Ce destructeur ne fonctionnera que si la méthode Dispose n'est pas appelée. " Je lis ceci comme le destructeur ne sera pas cher si l'objet est éliminé mais qu'il y a des circonstances où le destructeur sera nécessaire ... Je pourrais commencer une autre question à ce sujet spécifiquement. – Patrick
Patrick, la classe dans cet exemple MSDN a une ressource non gérée. Vous avez seulement des ressources gérées. –