Supposons que je crée une fermeture sur une ressource telle qu'un streamwriter: existe un moyen de fermer le streamwriter lorsque j'ai fini de fermer? Ou dois-je remplacer la fermeture avec un objet wrapper qui a une méthode d'écriture () et une méthode d'élimination ()? (Ceci est bien sûr un exemple banalisé.) Merci à tous. P> P>
3 Réponses :
Oui, vous devez remplacer la fermeture avec un objet (Pendant que vous y êtes, Idisposable code> avec une méthode et un
Dispose () code>. (Alternativement, retournez une tuple de fermetures, la seconde dont les appels
fermer () code> ou de ne pas le laisser à l'appelant comme celui-ci.) P>
system.io.path.combine () code> doit être utilisé, plutôt que de coller des noms de fichiers avec formatage de chaîne.) P>
Merci beaucoup Brian pour la réponse rapide. Le matériel F # disponible semble parler de fermetures et de gestion des ressources, mais pas les deux ensemble.
Je fais parfois:
let getwriter() = let writer = new StreamWriter(testfile, false) (fun() -> use writer = writer writer.Write "test")
Merci beaucoup pour votre réponse Dr. Harrop. Cela semble que cela empêche le travail d'ouvrir le fichier hors de la fermeture, mais ferme toujours le fichier comme la fermeture de la fermeture. Je vais utiliser cela à l'avenir.
Comme Brian a souligné, cela peut être plus ou moins explicite, bien que la mise en œuvre Cependant, il suffit parfois de masquer complètement la ressource jetable et d'obtenir une fermeture de ce qui doit être fait à la place. p> Idisposable code> est à propos de de déterministiquement em>, c'est-à-dire des ressources explicitement libérées. Ainsi, si la fermeture ne fournit pas de manière en quelque sorte une fonctionnalité d'élimination par elle-même, la ressource ne peut plus être libérée de manière déterministe.
Idisposable code> est préférable comme
user code> + isisposable prend automatiquement soin de la libération des ressources en cas d'exception. P>
Merci beaucoup pour votre réponse Dario. D'après ce que j'ai entendu, une fermeture est représentée comme un autre objet .NET. Je me demande si à un moment donné, nous aurons un moyen d'ajouter finaliser / jeter le code à celui-ci.