9
votes

F #: Disposer des ressources à l'intérieur d'une fermeture?

Supposons que je crée une fermeture sur une ressource telle qu'un streamwriter: xxx

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.


0 commentaires

3 Réponses :


7
votes

Oui, vous devez remplacer la fermeture avec un objet Idisposable avec une méthode et un Dispose () . (Alternativement, retournez une tuple de fermetures, la seconde dont les appels fermer () ou de ne pas le laisser à l'appelant comme celui-ci.)

(Pendant que vous y êtes, system.io.path.combine () doit être utilisé, plutôt que de coller des noms de fichiers avec formatage de chaîne.)


1 commentaires

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.



3
votes

Je fais parfois:

let getwriter() =
  let writer = new StreamWriter(testfile, false)
  (fun() ->
    use writer = writer
    writer.Write "test")


1 commentaires

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.



1
votes

Idisposable est à propos de de déterministiquement , 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.

Comme Brian a souligné, cela peut être plus ou moins explicite, bien que la mise en œuvre Idisposable est préférable comme user + isisposable prend automatiquement soin de la libération des ressources en cas d'exception.

Cependant, il suffit parfois de masquer complètement la ressource jetable et d'obtenir une fermeture de ce qui doit être fait à la place. xxx


1 commentaires

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.